Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€!

Наша компания спСциализируСтся Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ класса ERP, Π² составС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π»ΡŒΠ²ΠΈΠ½ΡƒΡŽ долю Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы с ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ объСмом бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΎΠ±ΠΎΡ€ΠΎΡ‚ΠΎΠΌ Π°-ля Π‘Π­Π”. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ вСрсии Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° тСхнологиях JavaEE, Π½ΠΎ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ экспСримСнтируСм с микросСрвисами. Одно ΠΈΠ· самых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Ρ… мСст Ρ‚Π°ΠΊΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ – интСграция Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… подсистСм, относящихся ΠΊ смСТным Π΄ΠΎΠΌΠ΅Π½Π°ΠΌ. Π—Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ всСгда доставляли Π½Π°ΠΌ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΡƒΡŽ Π³ΠΎΠ»ΠΎΠ²Π½ΡƒΡŽ боль, нСзависимо ΠΎΡ‚ примСняСмых Π½Π°ΠΌΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… стилСй, тСхнологичСских стэков ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ Π² послСднСС врСмя Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡ намСтился прогрСсс.

Π’ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΉ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΎΠ± ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Ρƒ НПО Β«ΠšΡ€ΠΈΡΡ‚Π°Β» ΠΎΠΏΡ‹Ρ‚Π΅ ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… изысканиях Π² ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ области. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ простого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈ выясним, Ρ‡Ρ‚ΠΎ скрываСтся Π·Π° этой простотой.

ДисклСймСр

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ ΠΈ тСхничСскиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ΡΡ ΠΌΠ½ΠΎΠΉ Π½Π° основС Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΠΏΡ‹Ρ‚Π° Π² контСкстС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Π­Ρ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΡŽΡ‚ Π½Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ ΠΈΠ½Ρ‹Ρ… условиях использования.

ΠŸΡ€ΠΈ Ρ‡Π΅ΠΌ Ρ‚ΡƒΡ‚ BPM?

Для ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° этот вопрос Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ³Π»ΡƒΠ±ΠΈΡ‚ΡŒΡΡ Π² спСцифику ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π½Π°ΡˆΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. Основная Ρ‡Π°ΡΡ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² нашСй Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС – это Π²Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π‘Π” Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ интСрфСйсы, ручная ΠΈ автоматизированная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° этих Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΡ… ΠΏΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ workflow, публикация Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ систСму / Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±Π°Π·Ρƒ / Π°Ρ€Ρ…ΠΈΠ², Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ систСмы для Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠΎΠ² являСтся автоматизация ΠΈΡ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… бизнСс-процСссов.

Для удобства ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Β» ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ‰ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Β«ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒΒ» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ workflow.
Но ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ с ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ? Π’Π΅Π΄ΡŒ Π·Π°Π΄Π°Ρ‡Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ пороТдаСтся Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ систСмы, которая «распилСна» Π½Π° части НЕ ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°, Π° ΠΏΠΎΠ΄ влияниСм совсСм Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ²:

  • ΠΏΠΎΠ΄ дСйствиСм Π·Π°ΠΊΠΎΠ½Π° КонвСя;
  • Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования подсистСм, Ρ€Π°Π½Π΅Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²;
  • ΠΏΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€Π°, исходя ΠΈΠ· Π½Π΅Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ.

БущСствуСт большой соблазн ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΡ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ основного workflow, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΡΠ·Π½ΡΡ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π°ΠΌΠΈ ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΎΡ‚ нСобходимости Π²Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π² особСнности Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° систСмы. Π£ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ ряд прСимущСств, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ:

  • Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ скатываСтся ΠΊ самым простым Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌ Π² Π²ΠΈΠ΄Π΅ синхронных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈΠ·-Π·Π° ограничСнности Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ основного workflow (ΠΎ нСдостатках синхронной ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ – Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅);
  • ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ всС Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ°ΡŽΡ‚ Π² ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ, ΠΊΠΎΠ³Π΄Π° трСбуСтся обратная связь ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ подсистСмы;
  • ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π»Π΅Π³ΠΊΠΎ Π΅Π΅ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² workflow;
  • систСма пСрСстаСт Π±Ρ‹Ρ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, становятся Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ Β«ΡˆΠ²Ρ‹Β» ΠΌΠ΅ΠΆΠ΄Ρƒ подсистСмами, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ подсистСмы Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ – рассмотрСниС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… взаимодСйствий ΠΊΠ°ΠΊ Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ части основной бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ workflow. Π§Ρ‚ΠΎΠ±Ρ‹ трСбования ΠΊ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π΅ Π²Π·Π»Π΅Ρ‚Π΅Π»ΠΈ Π΄ΠΎ нСбСс, созданиС Π½ΠΎΠ²Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… взаимодСйствий Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π»Π΅Π³ΠΊΠΎ ΠΈ Π½Π΅ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π΅Π½Π½ΠΎ, с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ возмоТностями для Π²Ρ‹Π±ΠΎΡ€Π° способа Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π­Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ слоТнСС, Ρ‡Π΅ΠΌ каТСтся: инструмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ достаточно ΠΌΠΎΡ‰Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ мноТСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π΅Π³ΠΎ примСнСния ΠΈ ΠΏΡ€ΠΈ этом Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Β«Π²Ρ‹ΡΡ‚Ρ€Π΅Π»ΠΈΡ‚ΡŒ сСбС Π² Π½ΠΎΠ³ΡƒΒ». БущСствуСт мноТСство вопросов, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ Π² контСкстС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Π½ΠΎ ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² своСй повсСднСвной Ρ€Π°Π±ΠΎΡ‚Π΅: Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΠ½ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ, Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, распрСдСлСниС Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ ΠΈ рСсурсов, Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³, ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ½Π³, распространСниС ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкстов ΠΈ Ρ‚.Β ΠΏ. НуТно ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ достаточно простыС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΆΠ΅ спрятаны ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° всС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ вопросы. Π­Ρ‚ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ достаточно бСзопасны: бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° мСняСтся ΠΎΡ‡Π΅Π½ΡŒ часто, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ риски внСсСния ошибок, Ρ†Π΅Π½Π° ошибок Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π° достаточно Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅.

Но всС-Ρ‚Π°ΠΊΠΈ ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ Ρ‚ΡƒΡ‚ BPM? Π•ΡΡ‚ΡŒ ΠΆΠ΅ мноТСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ workflow…
Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π² Π½Π°ΡˆΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ… ΠΎΡ‡Π΅Π½ΡŒ популярна другая рСализация бизнСс-процСссов – Ρ‡Π΅Ρ€Π΅Π· Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² состояний ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² с бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ Π½Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹. ΠŸΡ€ΠΈ этом состояниС, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Β«Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Β» Π² бизнСс-процСссС, являСтся Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ самого Β«Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Β».

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM
Π’Π°ΠΊ выглядит процСсс Π½Π° стартС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ обусловлСна ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ простотой ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ создания Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… бизнСс-процСссов. Однако ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ постоянного услоТнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… систСм автоматизированная Ρ‡Π°ΡΡ‚ΡŒ бизнСс-процСсса разрастаСтся ΠΈ услоТняСтся. ΠŸΠΎΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ использовании частСй процСссов, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ€Π°Π·Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΈ процСссов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ каТдая Π²Π΅Ρ‚ΠΊΠ° исполнялась ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Π’ Ρ‚Π°ΠΊΠΈΡ… условиях инструмСнт становится Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² состояний тСряСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ (ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ взаимодСйствия Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅).

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM
Π’Π°ΠΊ выглядит процСсс Ρ‡Π΅Ρ€Π΅Π· нСсколько ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ уточнСния Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ

Π’Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ· этой ситуации стала интСграция Π΄Π²ΠΈΠΆΠΊΠ° jBPM Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ с Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ слоТными бизнСс-процСссами. Π’ краткосрочной пСрспСктивС это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ успСх: появилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слоТных бизнСс-процСссов с сохранСниСм достаточно ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ Π² Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ BPMN2.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM
НСбольшая Ρ‡Π°ΡΡ‚ΡŒ слоТного бизнСс-процСсса

Π’ долгосрочной пСрспСктивС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡ€Π°Π²Π΄Π°Π»ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ: высокая Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ создания бизнСс-процСссов Ρ‡Π΅Ρ€Π΅Π· Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹Ρ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ продуктивности, Π° сам инструмСнт стал ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых Π½Π΅Π»ΡŽΠ±ΠΈΠΌΡ‹Ρ… срСди Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². К Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ устройству Π΄Π²ΠΈΠΆΠΊΠ° Ρ‚ΠΎΠΆΠ΅ Π±Ρ‹Π»ΠΈ ΠΏΡ€Π΅Ρ‚Π΅Π½Π·ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ ΠΊ появлСнию мноТСства Β«Π·Π°ΠΏΠ»Π°Ρ‚ΠΎΠΊΒ» ΠΈ «костылСй».

Π“Π»Π°Π²Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ примСнСния jBPM стало осознаниС ΠΏΠΎΠ»ΡŒΠ·Ρ‹ ΠΈ Π²Ρ€Π΅Π΄Π° ΠΎΡ‚ наличия собствСнного пСрсистСнтного состояния Ρƒ экзСмпляра бизнСс-процСсса. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ примСнСния процСссного ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слоТных ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ прилоТСниями с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ асинхронных взаимодСйствий Ρ‡Π΅Ρ€Π΅Π· сигналы ΠΈ сообщСния. НаличиС пСрсистСнтного состояния ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π² этом Π²Π°ΠΆΠ½Π΅ΠΉΡˆΡƒΡŽ Ρ€ΠΎΠ»ΡŒ.

На основании сказанного ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄: процСссный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² стилС BPM позволяСт Π½Π°ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ постоянно ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‰ΠΈΡ…ΡΡ бизнСс-процСссов, Π³Π°Ρ€ΠΌΠΎΠ½ΠΈΡ‡Π½ΠΎ Π²ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² эти процСссы ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ активности ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ процСсса Π² подходящСй для этого Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ.

НСдостатки синхронных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°

Под синхронной ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ понимаСтся ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ². Одна подсистСма выступаСт сСрвСрной стороной ΠΈ выставляСт API с Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Другая подсистСма выступаСт клиСнтской стороной ΠΈ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполняСт Π²Ρ‹Π·ΠΎΠ² с ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’ зависимости ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ систСмы клиСнтская ΠΈ сСрвСрная стороны ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π»ΠΈΠ±ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ процСссС, Π»ΠΈΠ±ΠΎ Π² Ρ€Π°Π·Π½Ρ‹Ρ…. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС трСбуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ RPC ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΠ°Π»Π»ΠΈΠ½Π³ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π²Ρ‹Π·ΠΎΠ²Π°.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM

Π’Π°ΠΊΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ достаточно большим Π½Π°Π±ΠΎΡ€ΠΎΠΌ нСдостатков, Π½ΠΎ ΠΎΠ½ ΠΎΡ‡Π΅Π½ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π² силу своСй простоты. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄ΠΊΡƒΠΏΠ°Π΅Ρ‚ ΠΈ заставляСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ снова ΠΈ снова Π² условиях «горящих» сроков, записывая Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² тСхничСский Π΄ΠΎΠ»Π³. Но Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΈ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π΅Π³ΠΎ нСосознанно, просто Π½Π΅ Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°ΡΡΡŒ ΠΎ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… послСдствиях.

Помимо Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ связности подсистСм, Π΅ΡΡ‚ΡŒ ΠΈ ΠΌΠ΅Π½Π΅Π΅ явныС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с «растаращиваниСм» ΠΈ «растягиваниСм» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° вносит ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ измСнСния, Ρ‚ΠΎΠ³Π΄Π° Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ рСсурсы прилоТСния, Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ этими измСнСниями. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠΊΠ° ΠΎΠ΄Π½Π° подсистСма Π½Π΅ доТдСтся ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΎΠ½Π° Π½Π΅ смоТСт Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΈ ΡΠ½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π­Ρ‚ΠΎ сущСствСнно ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ риск возникновСния Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… эффСктов:

  • тСряСтся ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ систСмы, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΏΠΎΠ΄ΠΎΠ»Π³Ρƒ ΠΆΠ΄ΡƒΡ‚ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° запросы;
  • сСрвСр Π²ΠΎΠΎΠ±Ρ‰Π΅ пСрСстаСт ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° запросы ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ·-Π·Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² «встали» Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ рСсурса, занятого Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ;
  • Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ дэдлоки: Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΡ… появлСния сильно зависит ΠΎΡ‚ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, количСства Π²ΠΎΠ²Π»Π΅Ρ‡Π΅Π½Π½ΠΎΠΉ Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ;
  • ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибки истСчСния Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ;
  • сСрвСр Β«ΠΏΠ°Π΄Π°Π΅Ρ‚Β» ΠΏΠΎ OutOfMemory, Ссли Π·Π°Π΄Π°Ρ‡Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ измСнСния Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ синхронных ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΉ сильно затрудняСт Π΄Ρ€ΠΎΠ±Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ Β«Π»Π΅Π³ΠΊΠΈΠ΅Β» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

Π‘ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ управлСния качСством ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… подсистСм: Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ качСства ΠΎΠ΄Π½ΠΎΠΉ подсистСмы Π² ΠΎΡ‚Ρ€Ρ‹Π²Π΅ ΠΎΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ качСства Π΄Ρ€ΡƒΠ³ΠΎΠΉ подсистСмы. Если подсистСмы Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, это большая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

ВсС становится Π΅Ρ‰Π΅ интСрСснСС, Ссли ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ подсистСмы находятся Π² Ρ€Π°Π·Π½Ρ‹Ρ… прилоТСниях ΠΈ Π½ΡƒΠΆΠ½ΠΎ внСсти синхронныС измСнСния с Π΄Π²ΡƒΡ… сторон. Как ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ?

Если измСнСния вносятся Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ транзакциями, Ρ‚ΠΎΠ³Π΄Π° потрСбуСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ компСнсации, Π° это ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½ΠΈΠ²Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ основноС прСимущСство синхронных ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΉ – простоту.

На ΡƒΠΌ Ρ‚Π°ΠΊΠΆΠ΅ приходят распрСдСлСнныС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π½ΠΎ ΠΌΡ‹ ΠΈΡ… Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² своих Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ…: слоТно ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ.

Β«Π‘Π°Π³Π°Β» ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ

Π‘ ростом популярности микросСрвисов всС Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π²ΠΎΡΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ Saga Pattern.

Π”Π°Π½Π½Ρ‹ΠΉ шаблон ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π΄ΠΎΠ»Π³ΠΈΡ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ возмоТности управлСния состояниСм систСмы со стороны бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ: компСнсация послС Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΎΡ‚ΠΊΠ°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ систСму Π² исходноС состояниС, Π° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ позволяСт Π½Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹Π΅ шаги ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°Ρ… довСсти процСсс Π΄ΠΎ Β«Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎΒ» Ρ„ΠΈΠ½Π°Π»Π°.

Π§Ρ‚ΠΎ интСрСсно, Π² ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½Ρ‹Ρ… систСмах этот шаблон Ρ‚Π°ΠΊΠΆΠ΅ Π°ΠΊΡ‚ΡƒΠ°Π»Π΅Π½, Ссли Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎΠ± ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ слабо связанных подсистСм ΠΈ Π½Π°Π±Π»ΡŽΠ΄Π°ΡŽΡ‚ΡΡ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ эффСкты, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ транзакциями ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ рСсурсов.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ нашим бизнСс-процСссам Π² стилС BPM ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Β«Π‘Π°Π³ΠΈΒ» оказываСтся ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ: ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ шаги Β«Π‘Π°Π³ΠΈΒ» ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ Π² Π²ΠΈΠ΄Π΅ активностСй Π²Π½ΡƒΡ‚Ρ€ΠΈ бизнСс-процСсса, Π° пСрсистСнтноС состояниС бизнСс-процСсса опрСдСляСт Π² Ρ‚ΠΎΠΌ числС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС Β«Π‘Π°Π³ΠΈΒ». Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π°ΠΌ Π½Π΅ трСбуСтся Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°. ΠŸΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ΡΡ лишь Π±Ρ€ΠΎΠΊΠ΅Ρ€ сообщСний с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Β«at least onceΒ» Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ Π² качСствС транспорта.

Но ΠΈ Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ своя Β«Ρ†Π΅Π½Π°Β»:

  • бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° становится Π±ΠΎΠ»Π΅Π΅ слоТной: Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ компСнсации;
  • потрСбуСтся ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ full consistency, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ особо Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ для ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½Ρ‹Ρ… систСм;
  • Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ услоТняСтся Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, появляСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² Π±Ρ€ΠΎΠΊΠ΅Ρ€Π΅ сообщСний;
  • ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ срСдства ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ администрирования (хотя Π² Ρ†Π΅Π»ΠΎΠΌ это Π΄Π°ΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ: качСство обслуТивания систСмы повысится).

Для ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½Ρ‹Ρ… систСм ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎΡΡ‚ΡŒ использования Β«Π‘Π°Π³Β» Π½Π΅ Ρ‚Π°ΠΊ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°. Для микросСрвисов ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… SOA, Π³Π΄Π΅, скорСС всСго, ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π±Ρ€ΠΎΠΊΠ΅Ρ€, Π° full consistency принСсСна Π² ΠΆΠ΅Ρ€Ρ‚Π²Ρƒ Π΅Ρ‰Π΅ Π½Π° стартС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, польза ΠΎΡ‚ использования этого шаблона ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅ΡΠΈΡ‚ΡŒ нСдостатки, особСнно ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ API Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ.

Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² микросСрвисах

Когда ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с микросСрвисами, Π²ΠΎΠ·Π½ΠΈΠΊ Ρ€Π΅Π·ΠΎΠ½Π½Ρ‹ΠΉ вопрос: ΠΊΡƒΠ΄Π° ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сСрвиса, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ΅Ρ€ΡΠΈΡΡ‚Π΅Π½Ρ†ΠΈΡŽ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…?

ΠŸΡ€ΠΈ взглядС Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… BPMS ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΡ‚ пСрсистСнции: ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ слой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎ-нСзависимых микросСрвисов, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… срСду ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для исполнСния Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, Π° ΠΏΠ΅Ρ€ΡΠΈΡΡ‚Π΅Π½Ρ†ΠΈΡŽ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ слоСм ΠΈΠ· ΠΎΡ‡Π΅Π½ΡŒ простых ΠΈ лСгковСсных микросСрвисов. БизнСс-процСссы Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ оркСстровку сСрвисов слоя пСрсистСнции.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM

Π£ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ большой плюс: ΠΌΠΎΠΆΠ½ΠΎ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π½Π°Ρ€Π°Ρ‰ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΈ Β«Ρ‚ΠΎΠ»ΡΡ‚Π΅Ρ‚ΡŒΒ» ΠΎΡ‚ этого Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ слой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹Ρ… микросСрвисов. БизнСс-процСссы ΠΈΠ· любого Π΄ΠΎΠΌΠ΅Π½Π° сразу ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π°.

Π‘ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ° выявила сущСствСнныС нСдостатки Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°:

  • ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹ΠΉ сСрвис, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ сразу ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ², нСсСт Π² сСбС большиС риски ΠΊΠ°ΠΊ Сдиная Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΡ‚ΠΊΠ°Π·Π°. ЧастыС измСнСния бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‚ риск возникновСния ошибок, приводящих ΠΊ сбоям, Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΌΡΡ Π½Π° всю систСму;
  • ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со своими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠ·ΠΊΠΈΠΉ ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ интСрфСйс:
    • Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ лишний Ρ€Π°Π· ΠΌΠ°Ρ€ΡˆΠ°Π»Π»ΠΈΡ‚ΡŒΡΡ ΠΈ ΠΏΡ€ΠΎΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· сСтСвой стэк;
    • Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ сСрвис Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ большС Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Π΅ΠΌ трСбуСтся бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈΠ·-Π·Π° нСдостаточных возмоТностСй ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ запросов Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ внСшнСй API сСрвиса;
    • нСсколько нСзависимых частСй бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ сСссионных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Π΅, Π½ΠΎ это Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ услоТняСт Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΈ создаСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΠ½Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ кэша);
  • ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ транзакционности:
    • бизнСс-процСссы с пСрсистСнтным состояниСм, Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ занимаСтся ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹ΠΉ сСрвис, Ρ€Π°ΡΡΠΎΠ³Π»Π°ΡΡƒΡŽΡ‚ΡΡ с Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΈ простых ΠΏΡƒΡ‚Π΅ΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ прСдвидится;
    • вынСсСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ: Ссли Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅ трСбуСтся внСсти измСнСния, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ коррСктности Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, трСбуСтся ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ измСнСния ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π½Π΅ΡˆΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ нСсСт Π² сСбС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ риски ΠΈ сниТаСт ΠΎΠ±Ρ‰ΡƒΡŽ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ систСмы;
  • Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ слоТности ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ: Π² рядС случаСв ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ сСрвис пСрсистСнции ΠΈ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ Π½ΡƒΠΆΠ½ΠΎ синхронно ΠΈΠ»ΠΈ Π² строгой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ истокам: ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ Π² ΠΎΠ΄ΠΈΠ½ микросСрвис. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ восприятиС микросСрвиса ΠΊΠ°ΠΊ цСлостного ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² составС систСмы ΠΈ Π½Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π­Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ даСтся Π½Π΅ бСсплатно:

  • трСбуСтся стандартизация API для взаимодСйствия с бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ (Π² частности, для обСспСчСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… активностСй Π² составС бизнСс-процСссов) ΠΈ API-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹Ρ… сСрвисов; трСбуСтся Π±ΠΎΠ»Π΅Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ измСнСнию API, прямой ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости;
  • трСбуСтся Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… runtime-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для обСспСчСния функционирования бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² составС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ микросСрвиса, ΠΈ это ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ трСбования ΠΊ Ρ‚Π°ΠΊΠΈΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ: Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… зависимостСй;
  • Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° вСрсиями Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ: Ссли ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ микросСрвис Π΄Π°Π²Π½ΠΎ Π½Π΅ Π΄ΠΎΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈ, Ρ‚ΠΎ Π² Π½Π΅ΠΌ, скорСС всСго, окаТСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ°Ρ вСрсия Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ прСпятствиСм для добавлСния Π½ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΡ‡ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ старой бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ сСрвиса Π½Π° Π½ΠΎΠ²Ρ‹Π΅ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ссли ΠΌΠ΅ΠΆΠ΄Ρƒ вСрсиями Π±Ρ‹Π»ΠΈ нСсовмСстимыС измСнСния.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM

Π‘Π»ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹Ρ… сСрвисов Π² Ρ‚Π°ΠΊΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ Ρ‚Π°ΠΊΠΆΠ΅ присутствуСт, Π½ΠΎ этот слой Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠΆΠ΅ Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для исполнСния Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, Π° всСго лишь Π΅Π΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, прСдоставляя Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Β«ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹Π΅Β» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΎΠΉ слой Π½ΡƒΠΆΠ΅Π½ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для сохранСния лСгковСсности Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… микросСрвисов, Π½ΠΎ ΠΈ для Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ управлСния.

НапримСр, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ активности Π² бизнСс-процСссах ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ. Однако, работая с Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ· всСх Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² Π² ΠΎΠ±Ρ‰Π΅ΠΌ спискС, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹ΠΉ сСрвис рСгистрации Π·Π°Π΄Π°Ρ‡, ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² Ρ‚Π°ΠΊΠΎΠΌ контСкстС достаточно ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ, ΠΈ это Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ компромисс Π΄Π°Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ бизнСс-процСссов Π³Π»Π°Π·Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

Как ΡƒΠΆΠ΅ сказано Π²Ρ‹ΡˆΠ΅, ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ абстрагирован ΠΎΡ‚ тСхничСских ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½Ρ‹Ρ… особСнностСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимодСйствия Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ достаточно Π½Π΅ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Π½ΡƒΡŽ для ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ «игровая» Π·Π°Π΄Π°Ρ‡Π° с участиСм Ρ‚Ρ€Π΅Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… опрСдСляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя: Β«app1Β», Β«app2Β», Β«app3Β».

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ прилоТСния Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ бизнСс-процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Β«ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π² мяч» Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ ΡˆΠΈΠ½Ρƒ. Π’ Ρ€ΠΎΠ»ΠΈ мяча Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ сообщСния с ΠΈΠΌΠ΅Π½Π΅ΠΌ Β«BallΒ».

ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹:

  • ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ – ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€. Он ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π² ΠΈΠ³Ρ€Ρƒ, Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΈΠ³Ρ€Ρƒ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π΅ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ;
  • Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π·Π°ΡΠ²Π»ΡΡŽΡ‚ ΠΎ своСм участии Π² ΠΈΠ³Ρ€Π΅, «знакомятся» Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ;
  • приняв мяч, ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅ΠΌΡƒ мяч. ВСдСтся подсчСт ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡;
  • Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π΅ΡΡ‚ΡŒ «энСргия», которая ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ мяча этим ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ. По истСчСнии энСргии ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ· ΠΈΠ³Ρ€Ρ‹, заявляя ΠΎ своСм ΡƒΡ…ΠΎΠ΄Π΅;
  • Ссли ΠΈΠ³Ρ€ΠΎΠΊ остался ΠΎΠ΄ΠΈΠ½, ΠΎΠ½ сразу заявляСт ΠΎΠ± ΡƒΡ…ΠΎΠ΄Π΅;
  • ΠΊΠΎΠ³Π΄Π° всС ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π²Ρ‹Π±Ρ‹Π²Π°ΡŽΡ‚, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ заявляСт ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΈΠ³Ρ€Ρ‹. Если ΠΎΠ½ Π²Ρ‹Π±Ρ‹Π» ΠΈΠ· ΠΈΠ³Ρ€Ρ‹ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‚ΠΎ остаСтся ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΈΠ³Ρ€ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π΅Π΅.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΊΠΈ я Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ нашим DSL для бизнСс-процСссов, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π½Π° Kotlin ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎ, с ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠΌ Π±ΠΎΠΉΠ»Π΅Ρ€ΠΏΠ»Π΅ΠΉΡ‚Π°.

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ app1 Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ бизнСс-процСсс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° (ΠΎΠ½ ΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€ ΠΈΠ³Ρ€Ρ‹):

class InitialPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.constraint.UniqueConstraints
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.dsl.taskOperation
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList : ArrayList<PlayerInfo>()

// Π­Ρ‚ΠΎ класс экзСмпляра процСсса: инкапсулируСт Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС
class InitialPlayer : ProcessImpl<InitialPlayer>(initialPlayerModel) {
    var playerName: String by persistent("Player1")
    var energy: Int by persistent(30)
    var players: PlayersList by persistent(PlayersList())
    var shotCounter: Int = 0
}

// Π­Ρ‚ΠΎ дСкларация ΠΌΠΎΠ΄Π΅Π»ΠΈ процСсса: создаСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ всСми
// экзСмплярами процСсса ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса
val initialPlayerModel = processModel<InitialPlayer>(name = "InitialPlayer",
                                                     version = 1) {

    // По ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ являСтся ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ³Ρ€Ρ‹ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ СдинствСнным
    uniqueConstraint = UniqueConstraints.singleton

    // ОбъявляСм активности, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоит бизнСс-процСсс
    val sendNewGameSignal = signal<String>("NewGame")
    val sendStopGameSignal = signal<String>("StopGame")
    val startTask = humanTask("Start") {
        taskOperation {
            processCondition { players.size > 0 }
            confirmation { "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΎΡΡŒ ${players.size} ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ². НачинаСм?" }
        }
    }
    val stopTask = humanTask("Stop") {
        taskOperation {}
    }
    val waitPlayerJoin = signalWait<String>("PlayerJoin") { signal ->
        players.add(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... join player ${signal.data} ...")
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        println("... player ${signal.data} is out ...")
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val throwStartBall = messageSend<Int>("Ball") {
        messageData = { 1 }
        activation = { selectNextPlayer() }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    // Π’Π΅ΠΏΠ΅Ρ€ΡŒ конструируСм Π³Ρ€Π°Ρ„ процСсса ΠΈΠ· ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… активностСй
    startFrom(sendNewGameSignal)
            .fork("mainFork") {
                next(startTask)
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut)
                        .branch("checkPlayers") {
                            ifTrue { players.isEmpty() }
                                    .next(sendStopGameSignal)
                                    .terminate()
                            ifElse().next(waitPlayerOut)
                        }
            }
    startTask.fork("afterStart") {
        next(throwStartBall)
                .branch("mainLoop") {
                    ifTrue { energy < 5 }.next(sendPlayerOut).next(waitBall)
                    ifElse().next(waitBall).next(throwBall).loop()
                }
        next(stopTask).next(sendStopGameSignal)
    }

    // НавСшаСм Π½Π° активности Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для логирования
    sendNewGameSignal.onExit { println("Let's play!") }
    sendStopGameSignal.onExit { println("Stop!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<InitialPlayer, Int>.selectNextPlayer() {
    val player = process.players.random()
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Помимо исполнСния бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΡƒΠΌΠ΅Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ модСль бизнСс-процСсса, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² Π²ΠΈΠ΄Π΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ, поэтому ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° рисованиС (здСсь я слСгка упростил BPMN Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Π² части использования Π³Π΅ΠΉΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ):

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ app2 Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ бизнСс-процСсс Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°:

class RandomPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList: ArrayList<PlayerInfo>()

class RandomPlayer : ProcessImpl<RandomPlayer>(randomPlayerModel) {

    var playerName: String by input(persistent = true, 
                                    defaultValue = "RandomPlayer")
    var energy: Int by input(persistent = true, defaultValue = 30)
    var players: PlayersList by persistent(PlayersList())
    var allPlayersOut: Boolean by persistent(false)
    var shotCounter: Int = 0

    val selfPlayer: PlayerInfo
        get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}

val randomPlayerModel = processModel<RandomPlayer>(name = "RandomPlayer", 
                                                   version = 1) {

    val waitNewGameSignal = signalWait<String>("NewGame")
    val waitStopGameSignal = signalWait<String>("StopGame")
    val sendPlayerJoin = signal<String>("PlayerJoin") {
        signalData = { playerName }
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
        eventCondition = { signal ->
            signal.sender.processInstanceId != process.id 
                && !process.players.any { signal.sender.processInstanceId == it.id}
        }
        handler = { signal ->
            players.add(PlayerInfo(
                    signal.data!!,
                    signal.sender.domain,
                    signal.sender.processInstanceId))
        }
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!,
                signal.sender.domain,
                signal.sender.processInstanceId))
        allPlayersOut = players.isEmpty()
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val receiveHandshake = messageWait<String>("Handshake") { message ->
        if (!players.any { message.sender.processInstanceId == it.id}) {
            players.add(PlayerInfo(
                    message.data!!, 
                    message.sender.domain, 
                    message.sender.processInstanceId))
        }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    startFrom(waitNewGameSignal)
            .fork("mainFork") {
                next(sendPlayerJoin)
                        .branch("mainLoop") {
                            ifTrue { energy < 5 || allPlayersOut }
                                    .next(sendPlayerOut)
                                    .next(waitBall)
                            ifElse()
                                    .next(waitBall)
                                    .next(throwBall)
                                    .loop()
                        }
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut).next(waitPlayerOut)
                next(receiveHandshake).next(receiveHandshake)
                next(waitStopGameSignal).terminate()
            }

    sendPlayerJoin.onExit { println("$playerName: I'm here!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<RandomPlayer, Int>.selectNextPlayer() {
    val player = if (process.players.isNotEmpty()) 
        process.players.random() 
    else 
        process.selfPlayer
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ°:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ app3 сдСлаСм ΠΈΠ³Ρ€ΠΎΠΊΠ° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ: вмСсто случайного Π²Ρ‹Π±ΠΎΡ€Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ round-robin:

class RoundRobinPlayer

import ru.krista.bpm.ProcessInstance
import ru.krista.bpm.runtime.ProcessImpl
import ru.krista.bpm.runtime.dsl.processModel
import ru.krista.bpm.runtime.instance.MessageSendInstance

data class PlayerInfo(val name: String, val domain: String, val id: String)

class PlayersList: ArrayList<PlayerInfo>()

class RoundRobinPlayer : ProcessImpl<RoundRobinPlayer>(roundRobinPlayerModel) {

    var playerName: String by input(persistent = true, 
                                    defaultValue = "RoundRobinPlayer")
    var energy: Int by input(persistent = true, defaultValue = 30)
    var players: PlayersList by persistent(PlayersList())
    var nextPlayerIndex: Int by persistent(-1)
    var allPlayersOut: Boolean by persistent(false)
    var shotCounter: Int = 0

    val selfPlayer: PlayerInfo
        get() = PlayerInfo(playerName, env.eventDispatcher.domainName, id)
}

val roundRobinPlayerModel = processModel<RoundRobinPlayer>(
        name = "RoundRobinPlayer", 
        version = 1) {

    val waitNewGameSignal = signalWait<String>("NewGame")
    val waitStopGameSignal = signalWait<String>("StopGame")
    val sendPlayerJoin = signal<String>("PlayerJoin") {
        signalData = { playerName }
    }
    val sendPlayerOut = signal<String>("PlayerOut") {
        signalData = { playerName }
    }
    val waitPlayerJoin = signalWaitCustom<String>("PlayerJoin") {
        eventCondition = { signal ->
            signal.sender.processInstanceId != process.id 
                && !process.players.any { signal.sender.processInstanceId == it.id}
        }
        handler = { signal ->
            players.add(PlayerInfo(
                    signal.data!!, 
                    signal.sender.domain, 
                    signal.sender.processInstanceId))
        }
    }
    val waitPlayerOut = signalWait<String>("PlayerOut") { signal ->
        players.remove(PlayerInfo(
                signal.data!!, 
                signal.sender.domain, 
                signal.sender.processInstanceId))
        allPlayersOut = players.isEmpty()
    }
    val sendHandshake = messageSend<String>("Handshake") {
        messageData = { playerName }
        activation = {
            receiverDomain = process.players.last().domain
            receiverProcessInstanceId = process.players.last().id
        }
    }
    val receiveHandshake = messageWait<String>("Handshake") { message ->
        if (!players.any { message.sender.processInstanceId == it.id}) {
            players.add(PlayerInfo(
                    message.data!!, 
                    message.sender.domain, 
                    message.sender.processInstanceId))
        }
    }
    val throwBall = messageSend<Int>("Ball") {
        messageData = { shotCounter + 1 }
        activation = { selectNextPlayer() }
        onEntry { energy -= 1 }
    }
    val waitBall = messageWaitData<Int>("Ball") {
        shotCounter = it
    }

    startFrom(waitNewGameSignal)
            .fork("mainFork") {
                next(sendPlayerJoin)
                        .branch("mainLoop") {
                            ifTrue { energy < 5 || allPlayersOut }
                                    .next(sendPlayerOut)
                                    .next(waitBall)
                            ifElse()
                                    .next(waitBall)
                                    .next(throwBall)
                                    .loop()
                        }
                next(waitPlayerJoin).next(sendHandshake).next(waitPlayerJoin)
                next(waitPlayerOut).next(waitPlayerOut)
                next(receiveHandshake).next(receiveHandshake)
                next(waitStopGameSignal).terminate()
            }

    sendPlayerJoin.onExit { println("$playerName: I'm here!") }
    sendPlayerOut.onExit { println("$playerName: I'm out!") }
}

private fun MessageSendInstance<RoundRobinPlayer, Int>.selectNextPlayer() {
    var idx = process.nextPlayerIndex + 1
    if (idx >= process.players.size) {
        idx = 0
    }
    process.nextPlayerIndex = idx
    val player = if (process.players.isNotEmpty()) 
        process.players[idx] 
    else 
        process.selfPlayer
    receiverDomain = player.domain
    receiverProcessInstanceId = player.id
    println("Step ${process.shotCounter + 1}: " +
            "${process.playerName} >>> ${player.name}")
}

Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π½Π΅ отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ, поэтому Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ мСняСтся.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ΅Π½ тСст, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС это Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄ самого тСста, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ Π±ΠΎΠΉΠ»Π΅Ρ€ΠΏΠ»Π΅ΠΉΡ‚ΠΎΠΌ (Π½Π° самом Π΄Π΅Π»Π΅ я воспользовался тСстовым ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, созданным Ρ€Π°Π½Π΅Π΅ для тСстирования ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… бизнСс-процСссов):

testGame()

@Test
public void testGame() throws InterruptedException {
    String pl2 = startProcess(app2, "RandomPlayer", playerParams("Player2", 20));
    String pl3 = startProcess(app2, "RandomPlayer", playerParams("Player3", 40));
    String pl4 = startProcess(app3, "RoundRobinPlayer", playerParams("Player4", 25));
    String pl5 = startProcess(app3, "RoundRobinPlayer", playerParams("Player5", 35));
    String pl1 = startProcess(app1, "InitialPlayer");
    // Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΈΠ³Ρ€ΠΎΠΊΠΈ "познакомятся" Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.
    // Π–Π΄Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· sleep - ΠΏΠ»ΠΎΡ…ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π·Π°Ρ‚ΠΎ самоС простоС. 
    // НС Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊ Π² ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… тСстах!
    Thread.sleep(1000);
    // ЗапускаСм ΠΈΠ³Ρ€Ρƒ, закрывая ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ
    assertTrue(closeTask(app1, pl1, "Start"));
    app1.getWaiting().waitProcessFinished(pl1);
    app2.getWaiting().waitProcessFinished(pl2);
    app2.getWaiting().waitProcessFinished(pl3);
    app3.getWaiting().waitProcessFinished(pl4);
    app3.getWaiting().waitProcessFinished(pl5);
}

private Map<String, Object> playerParams(String name, int energy) {
    Map<String, Object> params = new HashMap<>();
    params.put("playerName", name);
    params.put("energy", energy);
    return params;
}

ЗапускаСм тСст, смотрим Π»ΠΎΠ³:

console output

Взята Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠ»ΡŽΡ‡Π° lock://app1/process/InitialPlayer
Let's play!
Бнята Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠ»ΡŽΡ‡Π° lock://app1/process/InitialPlayer
Player2: I'm here!
Player3: I'm here!
Player4: I'm here!
Player5: I'm here!
... join player Player2 ...
... join player Player4 ...
... join player Player3 ...
... join player Player5 ...
Step 1: Player1 >>> Player3
Step 2: Player3 >>> Player5
Step 3: Player5 >>> Player3
Step 4: Player3 >>> Player4
Step 5: Player4 >>> Player3
Step 6: Player3 >>> Player4
Step 7: Player4 >>> Player5
Step 8: Player5 >>> Player2
Step 9: Player2 >>> Player5
Step 10: Player5 >>> Player4
Step 11: Player4 >>> Player2
Step 12: Player2 >>> Player4
Step 13: Player4 >>> Player1
Step 14: Player1 >>> Player4
Step 15: Player4 >>> Player3
Step 16: Player3 >>> Player1
Step 17: Player1 >>> Player2
Step 18: Player2 >>> Player3
Step 19: Player3 >>> Player1
Step 20: Player1 >>> Player5
Step 21: Player5 >>> Player1
Step 22: Player1 >>> Player2
Step 23: Player2 >>> Player4
Step 24: Player4 >>> Player5
Step 25: Player5 >>> Player3
Step 26: Player3 >>> Player4
Step 27: Player4 >>> Player2
Step 28: Player2 >>> Player5
Step 29: Player5 >>> Player2
Step 30: Player2 >>> Player1
Step 31: Player1 >>> Player3
Step 32: Player3 >>> Player4
Step 33: Player4 >>> Player1
Step 34: Player1 >>> Player3
Step 35: Player3 >>> Player4
Step 36: Player4 >>> Player3
Step 37: Player3 >>> Player2
Step 38: Player2 >>> Player5
Step 39: Player5 >>> Player4
Step 40: Player4 >>> Player5
Step 41: Player5 >>> Player1
Step 42: Player1 >>> Player5
Step 43: Player5 >>> Player3
Step 44: Player3 >>> Player5
Step 45: Player5 >>> Player2
Step 46: Player2 >>> Player3
Step 47: Player3 >>> Player2
Step 48: Player2 >>> Player5
Step 49: Player5 >>> Player4
Step 50: Player4 >>> Player2
Step 51: Player2 >>> Player5
Step 52: Player5 >>> Player1
Step 53: Player1 >>> Player5
Step 54: Player5 >>> Player3
Step 55: Player3 >>> Player5
Step 56: Player5 >>> Player2
Step 57: Player2 >>> Player1
Step 58: Player1 >>> Player4
Step 59: Player4 >>> Player1
Step 60: Player1 >>> Player4
Step 61: Player4 >>> Player3
Step 62: Player3 >>> Player2
Step 63: Player2 >>> Player5
Step 64: Player5 >>> Player4
Step 65: Player4 >>> Player5
Step 66: Player5 >>> Player1
Step 67: Player1 >>> Player5
Step 68: Player5 >>> Player3
Step 69: Player3 >>> Player4
Step 70: Player4 >>> Player2
Step 71: Player2 >>> Player5
Step 72: Player5 >>> Player2
Step 73: Player2 >>> Player1
Step 74: Player1 >>> Player4
Step 75: Player4 >>> Player1
Step 76: Player1 >>> Player2
Step 77: Player2 >>> Player5
Step 78: Player5 >>> Player4
Step 79: Player4 >>> Player3
Step 80: Player3 >>> Player1
Step 81: Player1 >>> Player5
Step 82: Player5 >>> Player1
Step 83: Player1 >>> Player4
Step 84: Player4 >>> Player5
Step 85: Player5 >>> Player3
Step 86: Player3 >>> Player5
Step 87: Player5 >>> Player2
Step 88: Player2 >>> Player3
Player2: I'm out!
Step 89: Player3 >>> Player4
... player Player2 is out ...
Step 90: Player4 >>> Player1
Step 91: Player1 >>> Player3
Step 92: Player3 >>> Player1
Step 93: Player1 >>> Player4
Step 94: Player4 >>> Player3
Step 95: Player3 >>> Player5
Step 96: Player5 >>> Player1
Step 97: Player1 >>> Player5
Step 98: Player5 >>> Player3
Step 99: Player3 >>> Player5
Step 100: Player5 >>> Player4
Step 101: Player4 >>> Player5
Player4: I'm out!
... player Player4 is out ...
Step 102: Player5 >>> Player1
Step 103: Player1 >>> Player3
Step 104: Player3 >>> Player1
Step 105: Player1 >>> Player3
Step 106: Player3 >>> Player5
Step 107: Player5 >>> Player3
Step 108: Player3 >>> Player1
Step 109: Player1 >>> Player3
Step 110: Player3 >>> Player5
Step 111: Player5 >>> Player1
Step 112: Player1 >>> Player3
Step 113: Player3 >>> Player5
Step 114: Player5 >>> Player3
Step 115: Player3 >>> Player1
Step 116: Player1 >>> Player3
Step 117: Player3 >>> Player5
Step 118: Player5 >>> Player1
Step 119: Player1 >>> Player3
Step 120: Player3 >>> Player5
Step 121: Player5 >>> Player3
Player5: I'm out!
... player Player5 is out ...
Step 122: Player3 >>> Player5
Step 123: Player5 >>> Player1
Player5: I'm out!
Step 124: Player1 >>> Player3
... player Player5 is out ...
Step 125: Player3 >>> Player1
Step 126: Player1 >>> Player3
Player1: I'm out!
... player Player1 is out ...
Step 127: Player3 >>> Player3
Player3: I'm out!
Step 128: Player3 >>> Player3
... player Player3 is out ...
Player3: I'm out!
Stop!
Step 129: Player3 >>> Player3
Player3: I'm out!

Из всСго этого ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ²:

  • ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… инструмСнтов ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями Π±Π΅Π· ΠΎΡ‚Ρ€Ρ‹Π²Π° ΠΎΡ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ;
  • ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ (complexity) ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ΅Ρ‚Π΅Π½Ρ†ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, Ссли ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π·Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ это Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°. Π’Ρ€ΡƒΠ΄Π½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ (difficulty) ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π½Π΅ получится, поэтому Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ Π² ΠΊΠΎΠ΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ соотвСтствСнно;
  • ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ eventually consistency ΠΈ отсутствиС линСаризуСмости измСнСния состояния всСх участников ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ Π²Ρ‹Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π΅ Π½Π΅Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊ порядку возникновСния Π²Π½Π΅ΡˆΠ½ΠΈΡ… событий. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ участиС Π² ΠΈΠ³Ρ€Π΅ ΡƒΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ заявит ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· ΠΈΠ³Ρ€Ρ‹: Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΅ΠΌΡƒ мяч, ΠΏΠΎΠΊΠ° информация ΠΎ Π΅Π³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π½Π΅ Π΄ΠΎΠΉΠ΄Π΅Ρ‚ ΠΈ Π½Π΅ обработаСтся всСми участниками. Π­Ρ‚Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π΅ Π²Ρ‹Ρ‚Π΅ΠΊΠ°Π΅Ρ‚ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ» ΠΈΠ³Ρ€Ρ‹ ΠΈ являСтся компромиссным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹.

Π”Π°Π»Π΅Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… тонкостях нашСго Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, компромиссах ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Ρ….

ВсС сообщСния – Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

ВсС ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ прилоТСния Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ шиной, которая прСдставлСна Π² Π²ΠΈΠ΄Π΅ внСшнСго Π±Ρ€ΠΎΠΊΠ΅Ρ€Π°, ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ BPMQueue – для сообщСний ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΏΠΈΠΊΠ° BPMTopic – для сигналов (событий). ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ всС сообщСния Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ само ΠΏΠΎ сСбС являСтся компромиссом. На ΡƒΡ€ΠΎΠ²Π½Π΅ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² сообщСний, Π½Π΅ внося ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² структуру систСмы. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅, Π½ΠΎ ΠΎΠ½ΠΎ нСсСт Π² сСбС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ риски, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² контСкстС Π½Π°ΡˆΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ показались Π½Π°ΠΌ Π½Π΅ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΡƒΠΆ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² стилС BPM

Однако здСсь Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° Ρ‚ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ: ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ «свои» сообщСния ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π΅Ρ‰Π΅ Π½Π° Π²Ρ…ΠΎΠ΄Π΅, ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ своСго Π΄ΠΎΠΌΠ΅Π½Π°. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΌΠ΅Π½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ ΠΈ Π² сигналах, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Β«ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости» сигнала ΠΎΠ΄Π½ΠΈΠΌ СдинствСнным ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΡˆΠΈΠ½Ρ‹, Π½ΠΎ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π΄ΠΎΠΌΠ΅Π½ΠΎΠ²: для адрСсации сообщСний – ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, для сигналов – ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ надСТности ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΡˆΠΈΠ½Ρ‹

ΠΠ°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ складываСтся ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ²:

  • Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π±Ρ€ΠΎΠΊΠ΅Ρ€ сообщСний – критичСски Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ Сдиная Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΡ‚ΠΊΠ°Π·Π°: ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ достаточно отказоустойчивым. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, с Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΈ большим ΠΊΠΎΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ;
  • Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π±Ρ€ΠΎΠΊΠ΅Ρ€Π° сообщСний, для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ физичСски ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слоТнСС ΠΈ Π΄ΠΎΡ€ΠΎΠΆΠ΅);
  • Π±Ρ€ΠΎΠΊΠ΅Ρ€ обязан ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Β«at least onceΒ» Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ доставки. Π­Ρ‚ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ для Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΡˆΠΈΠ½Ρ‹. Π’ гарантиях уровня Β«exactly onceΒ» Π½Π΅Ρ‚ нСобходимости: бизнСс-процСссы, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌΡƒ ΠΏΠΎΡΡ‚ΡƒΠΏΠ»Π΅Π½ΠΈΡŽ сообщСний ΠΈΠ»ΠΈ событий, Π° Π² особых Π·Π°Π΄Π°Ρ‡Π°Ρ…, Π³Π΄Π΅ это Π²Π°ΠΆΠ½ΠΎ, ΠΏΡ€ΠΎΡ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π² бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ, Ρ‡Π΅ΠΌ постоянно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ достаточно Β«Π΄ΠΎΡ€ΠΎΠ³ΠΈΠ΅Β» Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ;
  • ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сообщСний ΠΈ сигналов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΠ²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π² ΠΎΠ±Ρ‰ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ состояния бизнСс-процСссов ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ использованиС ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Transactional Outbox, Π½ΠΎ ΠΎΠ½ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π±Π°Π·Π΅ ΠΈ рСтранслятора. Π’ JEE-прилоТСниях ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ с использованиСм локального JTA-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°, Π½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ Π±Ρ€ΠΎΠΊΠ΅Ρ€Ρƒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ XA;
  • ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ входящих сообщСний ΠΈ событий Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ измСнСния состояния бизнСс-процСсса: Ссли такая транзакция откатываСтся, Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌ сообщСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½;
  • сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ·-Π·Π° ошибок, Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DLQ (Dead Letter Queue). ΠœΡ‹ для этого создали ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹ΠΉ микросСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сохраняСт Ρ‚Π°ΠΊΠΈΠ΅ сообщСния Π² своСм Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, индСксируСт ΠΈΡ… ΠΏΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ (для быстрой Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ поиска), ΠΈ выставляСт API для просмотра, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠΎ адрСсу назначСния, удалСния сообщСний. Администраторы систСмы ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с этим сСрвисом Ρ‡Π΅Ρ€Π΅Π· свой Π²Π΅Π±-интСрфСйс;
  • Π² настройках Π±Ρ€ΠΎΠΊΠ΅Ρ€Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ количСство ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ доставки ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ доставками, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ попадания сообщСний Π² DLQ (Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ практичСски Π½Π΅Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ эмпиричСски ΠΈ ΠΏΠΎΠ΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ эксплуатации);
  • Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ DLQ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒΡΡ, ΠΈ систСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°Ρ‚ΡŒ администраторов систСмы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ появлСнии нСдоставлСнных сообщСний Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Β«Π·ΠΎΠ½Ρƒ пораТСния» возникшСго сбоя ΠΈΠ»ΠΈ ошибки бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ;
  • интСграционная шина Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π½Π΅Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π° ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌΡƒ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ: подписки Π½Π° Ρ‚ΠΎΠΏΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ durable, Π° Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя прилоТСния Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π° врСмя отсутствия прилоТСния Π΅Π³ΠΎ сообщСния ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π΅ попытался ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ потокобСзопасности бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ

ΠžΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ экзСмпляру бизнСс-процСсса ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ сразу нСсколько сообщСний ΠΈ событий, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… запустится ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя для ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° всС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ просто ΠΈ потокобСзопасно.

БизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° процСсса ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ внСшнСС событиС, Π²Π»ΠΈΡΡŽΡ‰Π΅Π΅ Π½Π° этот бизнСс-процСсс, ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’Π°ΠΊΠΈΠΌΠΈ событиями ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ:

  • запуск экзСмпляра бизнСс-процСсса;
  • дСйствиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, относящССся ΠΊ активности Π²Π½ΡƒΡ‚Ρ€ΠΈ бизнСс-процСсса;
  • поступлСниС сообщСния ΠΈΠ»ΠΈ сигнала, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ подписан экзСмпляр бизнСс-процСсса;
  • срабатываниС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, установлСнного экзСмпляром бизнСс-процСсса;
  • ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ воздСйствиС Ρ‡Π΅Ρ€Π΅Π· API (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ процСсса).

КаТдоС Ρ‚Π°ΠΊΠΎΠ΅ событиС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ состояниС экзСмпляра бизнСс-процСсса: ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈ активности ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ значСния пСрсистСнтных свойств. Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ любой активности ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… активностСй. Π’Π΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… событий ΠΈΠ»ΠΈ ΠΆΠ΅, Ссли ΠΈΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π΅Π΄ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ΅ состояниС бизнСс-процСсса сохраняСтся Π² Π‘Π”, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ наступлСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ внСшнСго события.

ΠŸΠ΅Ρ€ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ бизнСс-процСсса, сохранСнныС Π² Ρ€Π΅Π»ΡΡ†ΠΈΠΎΠ½Π½ΡƒΡŽ Π‘Π”, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ синхронизации ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ SELECT FOR UPDATE. Если ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ состояниС бизнСс-процСсса ΠΈΠ· Π±Π°Π·Ρ‹ для Π΅Π³ΠΎ измСнСния, Ρ‚ΠΎ никакая другая транзакция ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ смоТСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ это ΠΆΠ΅ самоС состояниС для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ измСнСния, Π° послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ вторая Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΡƒΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ состояниС.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ пСссимистичСскиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° сторонС Π‘Π£Π‘Π”, ΠΌΡ‹ выполняСм всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ трСбования ACID, Π° Ρ‚Π°ΠΊΠΆΠ΅ сохраняСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ прилоТСния с бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΏΡƒΡ‚Π΅ΠΌ увСличСния количСства Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… экзСмпляров.

Однако пСссимистичСскиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ грозят Π½Π°ΠΌ дэдлоками, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, SELECT FOR UPDATE всС-Ρ‚Π°ΠΊΠΈ стоит ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠΌ Π½Π° случай возникновСния дэдлоков Π½Π° ΠΊΠ°ΠΊΠΈΡ…-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²ΠΎΠΏΠΈΡŽΡ‰ΠΈΡ… кСйсах Π² бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅.

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° – синхронизация старта бизнСс-процСсса. Пока Π½Π΅Ρ‚ экзСмпляра бизнСс-процСсса, Π½Π΅Ρ‚ ΠΈ Π΅Π³ΠΎ состояния Π² Π±Π°Π·Π΅, поэтому описанный ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚. Если Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ экзСмпляра бизнСс-процСсса Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ скоупС, Ρ‚ΠΎΠ³Π΄Π° потрСбуСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации, ассоциированный с классом процСсса ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ скоупом. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π²Π·ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ рСсурса, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ URI, Ρ‡Π΅Ρ€Π΅Π· внСшний сСрвис.

Π’ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… бизнСс-процСсс InitialPlayer содСрТит объявлСниС

uniqueConstraint = UniqueConstraints.singleton

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ сообщСния ΠΎ взятии ΠΈ освобоТдСнии Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. По Π΄Ρ€ΡƒΠ³ΠΈΠΌ бизнСс-процСссам Ρ‚Π°ΠΊΠΈΡ… сообщСний Π½Π΅Ρ‚: uniqueConstraint Π½Π΅ Π·Π°Π΄Π°Π½.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ бизнСс-процСссов с пСрсистСнтным состояниСм

Иногда Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ пСрсистСнтного состояния Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚, Π½ΠΎ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.
ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ внСсти измСнСния Π² бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ/ΠΈΠ»ΠΈ модСль бизнСс-процСсса. НС любоС Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ оказываСтся совмСстимым со старым состояниСм бизнСс-процСссов. Если Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Β«ΠΆΠΈΠ²Ρ‹Ρ…Β» экзСмпляров, Ρ‚ΠΎΠ³Π΄Π° внСсСниС нСсовмСстимых ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ массу нСприятностСй, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ часто ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΏΡ€ΠΈ использовании jBPM.

Π’ зависимости ΠΎΡ‚ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ двумя путями:

  1. ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ бизнСс-процСсса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Π½ΠΎΡΠΈΡ‚ΡŒ нСсовмСстимых ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² старый, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ вмСсто старого ΠΏΡ€ΠΈ запускС Π½ΠΎΠ²Ρ‹Ρ… экзСмпляров. Π‘Ρ‚Π°Ρ€Ρ‹Π΅ экзСмпляры Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Β«ΠΏΠΎ-старому»;
  2. ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пСрсистСнтноС состояниС бизнСс-процСссов ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ простой, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ свои ограничСния ΠΈ нСдостатки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… модСлях бизнСс-процСссов, ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ объСма бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ;
  • часто трСбуСтся ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡƒΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ (Π² части ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ – ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда);
  • Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ Π·Π½Π°Π΅Ρ‚, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, Π½ΠΎ приняли ряд Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ сСбС Тизнь:

  • Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… пСрсистСнтноС состояниС бизнСс-процСсса сохраняСтся Π² Π»Π΅Π³ΠΊΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΌ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ Π²ΠΈΠ΄Π΅: Π² строкС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° JSON. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ прилоТСния, Ρ‚Π°ΠΊ ΠΈ снаруТи. Π’ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ (особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π²ΠΎ врСмя ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ);
  • интСграционная бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Π½Π° бизнСс-процСссов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… процСссов Π½Π° Π½ΠΎΠ²ΡƒΡŽ, с Π½ΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«InitialPlayerV2Β»). БвязываниС происходит Ρ‡Π΅Ρ€Π΅Π· ΠΈΠΌΠ΅Π½Π° сообщСний ΠΈ сигналов;
  • модСль процСсса ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ вСрсии, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ, Ссли вносим Π² эту модСль нСсовмСстимыС измСнСния, ΠΈ этот Π½ΠΎΠΌΠ΅Ρ€ сохраняСтся вмСстС с состояниСм экзСмпляра процСсса;
  • пСрсистСнтноС состояниС процСсса вычитываСтся ΠΈΠ· Π±Π°Π·Ρ‹ сначала Π² ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΡƒΡŽ модСль, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ, Ссли измСнился Π½ΠΎΠΌΠ΅Ρ€ вСрсии ΠΌΠΎΠ΄Π΅Π»ΠΈ;
  • ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ размСщаСтся рядом с бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΈ вызываСтся Β«Π»Π΅Π½ΠΈΠ²ΠΎΒ» для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ экзСмпляра бизнСс-процСсса Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π³ΠΎ восстановлСния ΠΈΠ· Π±Π°Π·Ρ‹;
  • Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ состояниС всСх экзСмпляров процСсса ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΈ синхронно, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ классичСскиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π‘Π”, Π½ΠΎ Ρ‚Π°ΠΌ приходится Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с JSON.

НуТСн Π»ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для бизнСс-процСссов?

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ Π½Π°ΠΌ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ сСбС Тизнь, Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΊΡ€ΡƒΠ³ вопросов, Ρ€Π΅ΡˆΠ°Π΅ΠΌΡ‹Ρ… Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠ΄Π΅ΠΈ выдСлСния бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² микросСрвисы. Для этого Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹, создан ΠΎΡ‡Π΅Π½ΡŒ «лСгковСсный» Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для бизнСс-процСссов, Π° Ρ‚Π°ΠΊΠΆΠ΅ слуТСбныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² контСкстС ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Π£ нас Π΅ΡΡ‚ΡŒ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ этими Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ, вынСсти Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΎΠ±Ρ‰ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ доступ ΠΏΠΎΠ΄ свободной Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… усилий ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ПониманиС вострСбованности Ρ‚Π°ΠΊΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ ΡΡ‚Π°Ρ‚ΡŒ для нас Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ стимулом. Π’ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ внимания ΡƒΠ΄Π΅Π»Π΅Π½ΠΎ возмоТностям самого Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Π²ΠΈΠ΄Π½Ρ‹ ΠΈΠ· прСдставлСнных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Если ΠΌΡ‹ всС-Ρ‚Π°ΠΊΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ свой Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ посвящСна ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ. А ΠΏΠΎΠΊΠ° Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, Ссли оставитС нСбольшой фидбэк, ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ² Π½Π° вопрос:

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

Π½ΡƒΠΆΠ΅Π½ Π»ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для бизнСс-процСссов?

  • 18,8%Π΄Π°, Π΄Π°Π²Π½ΠΎ ΠΈΡ‰Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅3

  • 12,5%интСрСсно ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Π²Π°ΡˆΡƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ побольшС, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ2

  • 6,2%ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², Π½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΡ‹Π²Π°Π΅ΠΌ ΠΎ Π·Π°ΠΌΠ΅Π½Π΅1

  • 18,8%ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², всС устраиваСт3

  • 18,8%справляСмся Π±Π΅Π· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°3

  • 25,0%пишСм свой4

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 16 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ 7 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ