ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Domain Driven Design

Π‘ΠΈΠ½ΠΈΠΉ ΠΊΠΈΡ‚ β€” ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ слоТного ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° пошло Π½Π΅ ΠΏΠΎ ΠΏΠ»Π°Π½Ρƒ. ΠšΠΈΡ‚ внСшнС ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Ρ€Ρ‹Π±Ρƒ, Π½ΠΎ ΠΎΠ½ ΠΌΠ»Π΅ΠΊΠΎΠΏΠΈΡ‚Π°ΡŽΡ‰Π΅Π΅: ΠΊΠΎΡ€ΠΌΠΈΡ‚ Π΄Π΅Ρ‚Π΅Π½Ρ‹ΡˆΠ΅ΠΉ ΠΌΠΎΠ»ΠΎΠΊΠΎΠΌ, Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΡˆΠ΅Ρ€ΡΡ‚ΡŒ, Π° Π² ΠΏΠ»Π°Π²Π½ΠΈΠΊΠ°Ρ… Π΄ΠΎ сих ΠΏΠΎΡ€ ΡΠΎΡ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ кости ΠΏΡ€Π΅Π΄ΠΏΠ»Π΅Ρ‡ΡŒΡ ΠΈ кистСй с ΠΏΠ°Π»ΡŒΡ†Π°ΠΌΠΈ, ΠΊΠ°ΠΊ Ρƒ сухопутных. Он ΠΆΠΈΠ²Π΅Ρ‚ Π² ΠΎΠΊΠ΅Π°Π½Π°Ρ…, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ Π²ΠΎΠ΄ΠΎΠΉ, поэтому рСгулярно поднимаСтся Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π³Π»ΠΎΡ‚Π½ΡƒΡ‚ΡŒ Π²ΠΎΠ·Π΄ΡƒΡ…Π°, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° спит. ΠšΠΈΡ‚ самоС большоС ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ Π² ΠΌΠΈΡ€Π΅, Π΄Π»ΠΈΠ½ΠΎΠΉ с дСвятиэтаТный Π΄ΠΎΠΌ, Π° массой ΠΊΠ°ΠΊ 75 Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ Volkswagen Touareg, Π½ΠΎ ΠΏΡ€ΠΈ этом Π½Π΅ Ρ…ΠΈΡ‰Π½ΠΈΠΊ, Π° питаСтся ΠΏΠ»Π°Π½ΠΊΡ‚ΠΎΠ½ΠΎΠΌ.

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

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ DDD ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ инструмСнты Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ, ΠΌΡ‹ расскаТСм Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π° основС Π΄ΠΎΠΊΠ»Π°Π΄Π° АртСма ΠœΠ°Π»Ρ‹ΡˆΠ΅Π²Π°. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ DDD Π² Python, инструмСнты, ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ, ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° β€” всС это ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ΠΎΠΌ.

АртСм ΠœΠ°Π»Ρ‹ΡˆΠ΅Π² (proofit404) β€” нСзависимый Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΏΠΈΡˆΠ΅Ρ‚ Π½Π° Python 5 Π»Π΅Ρ‚, Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π» с Django Channels 1.0. ПозТС сфокусировался Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°Ρ…: ΠΈΠ·ΡƒΡ‡ΠΈΠ», ΠΊΠ°ΠΊΠΎΠ³ΠΎ инструмСнтария Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌ Π½Π° Python, ΠΈ Π½Π°Ρ‡Π°Π» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ dry-python. Π‘ΠΎΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Drylabs.

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” это постоянная Π±ΠΎΡ€ΡŒΠ±Π° со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ сами Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π½Π΅ΡΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π΅ΡΡ‚Π΅ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°.

Как Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ? ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, условия ΠΈ Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΈ ΠΊΠ°ΠΊ это всС Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ тяТСло Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ β€” Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ тСхничСская привнСсСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ привнСсСнной слоТности β€” ΠΌΠΎΠΉ Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΉ Β«callback hellΒ».

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Когда ΠΌΡ‹ пишСм Π² Ρ€Π°ΠΌΠΊΠ°Ρ… событийно-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ (EDA) ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π½Π΅ самый Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ соврСмСнный Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ нСпонятно, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠΎΠ³Π΄Π° происходит. Π§ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ тяТСло β€” это ΠΎΠΏΡΡ‚ΡŒ привнСсСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΠΎΠΆΠ°ΡŽΡ‚ тСхничСскиС слоТности, Π½ΠΎ Π΅Ρ‰Π΅ ΠΈ спорят, какая ΠΈΠ· Π½ΠΈΡ… Π»ΡƒΡ‡ΡˆΠ΅:

Один ΠΈΠ· Π½ΠΈΡ… β€” Π­Ρ€ΠΈΠΊ Эванс. Π’ 2004 Π³ΠΎΠ΄Ρƒ ΠΎΠ½ написал ΠΊΠ½ΠΈΠ³Ρƒ Β«Domain Driven DesignΒ» (Β«ΠŸΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β»). Она «выстрСлила» ΠΈ Π΄Π°Π»Π° ΠΈΠΌΠΏΡƒΠ»ΡŒΡ большС Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ бизнСсС, Π° тСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΎΡ‚ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ»Π°Π½.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ DDD?

Π‘Π½Π°Ρ‡Π°Π»Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π° ΠΏΠΎΡ‚ΠΎΠΌ инструмСнты. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Эванс Π²ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π» Π² понятиС DDD, Ρ‡Ρ‚ΠΎ это Π½Π΅ тСхнология, Π° философия. Π’ философии сначала Π½ΡƒΠΆΠ½ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π° ΡƒΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΌ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°ΠΊΠΈΡ… инструмСнтов.

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

ΠŸΠΈΡˆΠΈΡ‚Π΅ ПО, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ явно Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π‘Π°ΠΌΠΎΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ DDD ΠΎΡ‚ простой ΠΊΠΎΠ»Π»Π°Π±ΠΎΡ€Π°Ρ†ΠΈΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ПО Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ стилС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ с экспСртами ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области. Вся тСрминология, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΈ ΠΏΡ€ΠΈΠ½ΡΡ‚ΠΈΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сохранСны Π² исходном ΠΊΠΎΠ΄Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ тСхничСский Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΌΠΎΠ³ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ происходит.

Π“ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ с бизнСсом Π½Π° ΠΎΠ΄Π½ΠΎΠΌ языкС. DDD β€” это философия ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ с экспСртами ΠΈΠ· бизнСса Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ языкС Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ области ΠΈ ΠΊ этой области ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡŽ. Π£ нас появляСтся ΠΎΠ±Ρ‰ΠΈΠΉ язык ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… связанного контСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ считаСм истиной. ΠœΡ‹ создаСм Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π²ΠΎΠΊΡ€ΡƒΠ³ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Π‘Π½Π°Ρ‡Π°Π»Π° тСхничСская Ρ‡Π°ΡΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌ β€” DDD. Π‘ΠΊΡƒΠ»ΡŒΠΏΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ высСкаСт ΡΡ‚Π°Ρ‚ΡƒΡŽ ΠΈΠ· камня Π½Π΅ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΌΠ°Π½ΡƒΠ°Π» ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠΎΠ»ΠΎΡ‚ΠΎΠΊ ΠΈ Π΄ΠΎΠ»ΠΎΡ‚ΠΎ β€” ΠΎΠ½ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ привнСсти DDD Π² ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, освойтС Ρ‚Π΅Ρ…Π½ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ: Π²Ρ‹ΡƒΡ‡ΠΈΡ‚Π΅ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Django, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΈ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΡŒΡ‚Π΅ ΡΠΏΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Ρ€Π°Ρ‚ΡŒ β€” PostgreSQL ΠΈΠ»ΠΈ MongoDB.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ шаблонов ΠΈ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² проСктирования β€” это тСхничСский ΡˆΡƒΠΌ. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ β€” тСхничСскиС. Они говорят, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π΅ говорят, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, бизнСса ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ внСшний ΠΌΠΈΡ€. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ ΠΈΠ»ΠΈ абстрактныС классы слабо привязаны ΠΊ DDD.

ΠŸΠ΅Ρ€Π²Π°Ρ «синяя» ΠΊΠ½ΠΈΠ³Π° Π²Ρ‹ΡˆΠ»Π° ΠΏΠΎΡ‡Ρ‚ΠΈ 20 Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄. Π›ΡŽΠ΄ΠΈ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² этом стилС, Ρ…ΠΎΠ΄ΠΈΠ»ΠΈ ΠΏΠΎ граблям, ΠΈ поняли, Ρ‡Ρ‚ΠΎ философия Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ, Π½ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ нСпонятная. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ появилась вторая ΠΊΠ½ΠΈΠ³Π° β€” «красная», ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ программистам ΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² DDD.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅
Β«ΠšΡ€Π°ΡΠ½Π°ΡΒ» ΠΈ «синяя» ΠΊΠ½ΠΈΠ³ΠΈ β€” это столпы, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… стоит всС DDD.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. ΠšΡ€Π°ΡΠ½Π°Ρ ΠΈ синяя ΠΊΠ½ΠΈΠ³ΠΈ β€” это ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ источник ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ DDD, Π½ΠΎ ΠΎΠ½ΠΈ тяТСлыС. Книги нСпросто Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ: Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅ ΠΈΠ·-Π·Π° слоТного языка ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ², Π° Π½Π° русском ΠΈΠ·-Π·Π° ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ DDD с Β«Π·Π΅Π»Ρ‘Π½ΠΎΠΉΒ» ΠΊΠ½ΠΈΠ³ΠΈ. Π­Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π΄Π²ΡƒΡ… с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅ ΠΈ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ описаниями. Но Π»ΡƒΡ‡ΡˆΠ΅ Ρ‚Π°ΠΊ, Ρ‡Π΅ΠΌ Ссли красная ΠΈ синяя ΠΊΠ½ΠΈΠ³Π° ΠΎΡ‚ΠΎΠ±ΡŒΡŽΡ‚ Ρƒ вас ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ DDD. Π›ΡƒΡ‡ΡˆΠ΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅.

Π’ красной ΠΊΠ½ΠΈΠ³Π΅ проскакиваСт идСя, ΠΊΠ°ΠΊ Π»ΡƒΡ‡ΡˆΠ΅ всСго DDD ΠΏΡ€ΠΈΠ²Π½ΠΎΡΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π²ΠΎΠΊΡ€ΡƒΠ³ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. ΠŸΠΎΡΠ²Π»ΡΠ΅Ρ‚ΡΡ новая тСрминология β€” Β«Model-Driven DesignΒ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ мСсто ставится наша модСль внСшнСго ΠΌΠΈΡ€Π°.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

ЕдинствСнноС мСсто, Π³Π΄Π΅ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ β€” Β«Smart UIΒ». Π­Ρ‚ΠΎ прослойка ΠΌΠ΅ΠΆΠ΄Ρƒ внСшним ΠΌΠΈΡ€ΠΎΠΌ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ Π½Π°ΠΌΠΈ (отсылка ΠΊ Π ΠΎΠ±Π΅Ρ€Ρ‚Ρƒ ΠœΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ ΠΈ Π΅Π³ΠΎ чистой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ со слоями). Как Π²ΠΈΠ΄ΠΈΠΌ, всС ΠΈΠ΄Π΅Ρ‚ ΠΊ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ модСль? Π­Ρ‚ΠΎ фантомная боль любого Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€Π°. ВсС Π΄ΡƒΠΌΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ это UML, Π½ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ.

МодСль β€” это Π½Π°Π±ΠΎΡ€ классов, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ссылок ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ бизнСс-сцСнарии Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

МодСль ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ со всСми Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ свойствами ΠΈ функциями. Π­Ρ‚ΠΎ высокоуровнСвый инструмСнтарий, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бизнСс-кСйсов. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ классы ΠΆΠ΅, это Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ инструмСнтарий для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

Dry-python

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½ΠΈΡˆΡƒ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, я Π½Π°Ρ‡Π°Π» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ dry-python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вырос Π² Π½Π°Π±ΠΎΡ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ высокоуровнСвых Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для построСния Model Driven Design. КаТдая ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ пытаСтся Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΊΡ€ΡƒΠ³ Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ ΠΈ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Π° ΠΌΠΎΠΆΠ½ΠΎ вмСстС, Ссли Π²ΠΎΠΉΡ‚ΠΈ Π²ΠΎ вкус.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ повСствования соотвСтствуСт Ρ…Ρ€ΠΎΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ добавлСния DDD Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” ΠΏΠΎ слоям. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ слой β€” сСрвисы, описаниС бизнСс-сцСнариСв (процСссов) Π² нашСй систСмС. Π—Π° этот слой ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Stories.

Stories

БизнСс-сцСнарии дСлятся Π½Π° Ρ‚Ρ€ΠΈ части:

Π­Ρ‚Π°ΠΏ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ шага. Π’ Ρ‚ΠΎΠΌ ΠΆΠ΅ классС subscription пишСм Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ бизнСс-шагам. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ состояниС, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²Π° Π΅Π³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΈ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ:

ЗапускаСм Story. Как Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Story Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅? Π­Ρ‚ΠΎ бизнСс-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄: ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π½Π° Π²Ρ…ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠ½ ΠΈΡ… Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ шаги. Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°ΡΡΡ Story ΠΏΠΎΠΌΠ½ΠΈΡ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ исполнСния, записываСт состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ происходило Π² Π½Π΅ΠΉ Π² бизнСс-процСссС, ΠΈ рассказываСт Π½Π°ΠΌ, ΠΊΡ‚ΠΎ влиял Π½Π° это состояниС.
ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅
ПанСль инструмСнтов ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Если пишСм Π½Π° Django ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ панСль ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ бизнСс-сцСнарии ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запросС ΠΈ ΠΈΡ… состояния.
ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅
Py.test. Если пишСм Π² py.test, Ρ‚ΠΎ для ΡƒΠΏΠ°Π²ΡˆΠ΅Π³ΠΎ тСста ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ бизнСс-сцСнарии Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС ΠΈ Ρ‡Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ β€” вмСсто ковыряния Π² ΠΊΠΎΠ΄Π΅, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ ΠΏΠΎΠΉΠΌΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Sentry. Π•Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ 500. Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ систСмС ΠΌΡ‹ смиряСмся с Π½Π΅ΠΉ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ вСсти расслСдованиС. Π’ Sentry ΠΆΠ΅, появится ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ошибки. Π£Π΄ΠΎΠ±Π½ΠΎ ΠΈ приятно, ΠΊΠΎΠ³Π΄Π° Π² 3 часа Π½ΠΎΡ‡ΠΈ Ρ‚Π°ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ собрали Π·Π° тСбя.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅
ELK. БСйчас ΠΌΡ‹ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π°Π΄ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ это всС Π² Elasticsearch Π² стСк Kibana ΠΈ строит Π³Ρ€Π°ΠΌΠΎΡ‚Π½Ρ‹Π΅ индСксы.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

НапримСр, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π° состояниС бизнСс-процСсса. ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, relation ID ΠΎΡ‚Ρ‡Π΅Ρ‚Π°. ВмСсто Π°Ρ€Ρ…Π°ΠΈΡ‡Π½ΠΎΠ³ΠΎ исслСдования Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ происходило, ΠΌΡ‹ пишСм запрос Π² Kibana. Он ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ всС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Story, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌ состояниС Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π°ΡˆΠΈΡ… бизнСс-процСссов ΠΈ бизнСс-сцСнариСв. ΠœΡ‹ Π½Π΅ пишСм Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π° логирования, Π½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ логируСтся ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Ρ‚ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ абстракции, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π°ΠΌ интСрСсно ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ.

Но хочСтся Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ высокоуровнСвого, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π»Π΅Π³ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ хранят Π² сСбС Π³Ρ€Π°ΠΌΠΎΡ‚Π½Ρ‹Π΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ ΠΏΡ€ΠΈΠ½ΡΡ‚ΠΈΡŽ бизнСс-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Π° Π½Π΅ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π‘Π”, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части Model-Driven Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ β€” entities, agregates ΠΈ value objects.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Entities, agregates ΠΈ value objects

Как всС это взаимосвязано? НапримСр, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ сдСлал Π·Π°ΠΊΠ°Π· ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, ΠΈ ΠΌΡ‹ выставляСм счСт. Π§Ρ‚ΠΎ здСсь ΠΊΠΎΡ€Π΅Π½ΡŒ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ, Π° Ρ‡Ρ‚ΠΎ β€” простой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚?

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

ВсС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΠΎ, это ΠΊΠΎΡ€Π΅Π½ΡŒ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ Ρ‚ΠΎ, с Ρ‡Π΅ΠΌ я Ρ…ΠΎΡ‡Ρƒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ: Π²Π°ΠΆΠ½ΠΎΠ΅, Ρ†Π΅Π½Π½ΠΎΠ΅, цСлостноС.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Π‘Ρ€Π°Π·Ρƒ ΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° β€” Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. Π£ мСня Π΅ΡΡ‚ΡŒ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Ρ‡Π΅Ρ€Π΅Π· Django, сосСдний микросСрвис, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽ запросы, Π΅ΡΡ‚ΡŒ JSON ΠΈ экзСмпляр Django-ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠŸΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ ΠΈΡ… Ρ€ΡƒΠΊΠ°ΠΌΠΈ, просто Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ красиво? НСт, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ. Π’ dry-python Π΅ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Mappers, которая позволяСт ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ высокоуровнСвыС абстракции ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ Π°Π³Ρ€Π΅Π³Π°Ρ‚Ρ‹ с мСстами, Π³Π΄Π΅ ΠΌΡ‹ ΠΈΡ… Ρ…Ρ€Π°Π½ΠΈΠΌ.

Mappers

Π§Π΅Ρ€Π΅Π· Mappers ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΈΠ»ΠΈ ΠΏΠΈΡˆΡƒΡ‚. Π§ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠ΅ β€” это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Π°Π³Ρ€Π΅Π³Π°Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½Π° Π½Π΅Π³ΠΎ рСфСрСнс. ΠŸΠΈΡˆΡƒΡ‰ΠΈΠ΅ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π°Π³Ρ€Π΅Π³Π°Ρ‚Ρ‹. Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, запрос ΠΊ Π±Π°Π·Π΅ Ρ‡Π΅Ρ€Π΅Π· Django.

Π’ ΠΎΠ΄Π½ΠΎΠΌ нашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π²Π΅Π±-сокСты Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· сСрвис Pusher. ΠœΡ‹ Π½Π΅ Π·Π°ΠΌΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π»ΠΈΡΡŒ, ΠΎΠ±Π΅Ρ€Π½ΡƒΠ»ΠΈ Π΅Π³ΠΎ Π² интСрфСйс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Π­Ρ‚ΠΎΡ‚ интСрфСйс привязывали Π²ΠΎ всСх Stories ΠΈ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹.

Но бизнСс-трСбования измСнились. Оказалось, Ρ‡Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСдоставляСт Pusher ΠΊ Π²Π΅Π± сокСтам, нСдостаточно. НапримСр, Π½ΡƒΠΆΠ½Π° гарантированная доставка сообщСний ΠΈ история сообщСний Π·Π° послСдниС 2 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΅Ρ…Π°Ρ‚ΡŒ Π½Π° сСрвис Ably Realtime. Π’ Π½Π΅ΠΌ ΠΆΠ΅ Π΅ΡΡ‚ΡŒ интСрфСйс β€” напишСм Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ ΠΈ привяТСм Π΅Π³ΠΎ Π²Π΅Π·Π΄Π΅, всС Π±ΡƒΠ΄Π΅Ρ‚ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ. На самом Π΄Π΅Π»Π΅ Π½Π΅Ρ‚.

Абстракции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Pusher (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ) ΠΏΠΎΠΏΠ°Π»ΠΈ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ бизнСс-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ порядка 100 Stories, ΠΈ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ отправляСм.

Tests & mocks

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ с внСшними сСрвисами? Π§Ρ‚ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΊΠ°Π΅ΠΌ, смотрим, ΠΊΠ°ΠΊ вызываСтся сторонняя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΈ всС β€” ΠΌΡ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Но ΠΊΠΎΠ³Π΄Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° мСняСтся, Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‚ΠΎΠΆΠ΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ.
ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅
МоТно ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ нСдСлю пСрСписывания тысячи тСстов ΠΈ сотни бизнСс-кСйсов, Ссли Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈΠ½Π°Ρ‡Π΅. НапримСр, Ρ‡Π΅ΠΌ-Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ тСстированиС: пишСм Π² ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π° ΡƒΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π°, Pusher ΠΈΠ»ΠΈ Ably транслируСм этот ΠΏΠΎΡ‚ΠΎΠΊ Π² Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ это всС Π² бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ.

Dependencies

Π’ Ρ‚Π°ΠΊΠΎΠΉ модСльной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ появляСтся ΠΌΠ½ΠΎΠ³ΠΎ Π»ΠΈΡˆΠ½ΠΈΡ… сущностСй. РаньшС ΠΌΡ‹ Π±Ρ€Π°Π»ΠΈ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Django-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ писали Π΅Π΅: запрос, ΠΎΡ‚Π²Π΅Ρ‚, ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Ρ‚Π΅Π»ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ. Π—Π΄Π΅ΡΡŒ Π½Π°Π΄ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Mappers, ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² Stories ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ строку запроса HTTP-запроса, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ. ВсС это выливаСтся Π² 30-50 строк boilerplate ΠΊΠΎΠ΄Π° Π²Ρ‹Π·ΠΎΠ²Π° Stories Π²Π½ΡƒΡ‚Ρ€ΠΈ Django-view.

ΠšΠ°Ρ€Ρ‚Π° Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π°

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ всС, ΠΎ Ρ‡Π΅ΠΌ я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ схСму, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСписали большой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Django сигналов (нСявного Β«callback hellΒ») Π½Π° Django ΠΏΠΎ DDD.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π±Π΅Π· DDD. Π‘Π½Π°Ρ‡Π°Π»Π° Ρƒ нас Π½Π΅ Π±Ρ‹Π»ΠΎ DDD β€” ΠΌΡ‹ писали MVP. Когда Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ дСньги, пригласили инвСсторов, ΠΈ ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° DDD.

Stories Π±Π΅Π· ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ². Π Π°Π·Π±ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ бизнСс-кСйсы Π±Π΅Π· ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ ΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Ρ‹. ΠŸΠΎΡ‚ΠΎΠΌ ΠΎΠ΄ΠΈΠ½ Π·Π° ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ модСль, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² нашСй Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅.

Mappers. Написали Mappers, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ шаблонов Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй. Избавились ΠΎΡ‚ шаблонов склСйки.

Если ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ пСрСрос MVP ΠΈ Π² Π½Π΅ΠΌ трСбуСтся срочно ΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π½Π΅ скатился Π² legacy β€” посмотритС Π² сторону DDD.

КакиС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ способы ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ legacy Π² Python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ с Π½ΠΈΠΌ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ, Ссли Π΄ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ тяТСлоС наслСдство, обсудим Π½Π° Moscow Python Conf++ 27 ΠΌΠ°Ρ€Ρ‚Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Π² расписании ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹ ΠΎ самых Ρ€Π°Π·Π½Ρ‹Ρ… аспСктах Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Python ΠΈ ΠΎΠ± Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. А Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ выступлСний Ρƒ нас unconference, ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ ΠΈΠ· ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… сообщСств, ΠΈ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΠΈ ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ Ρ€Π°Π· Drylabs.

А Ссли DDD интСрСсуСт вас Π²Π½Π΅ Python, Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° TechLead Conf β€” ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡŽ ΠΏΡ€ΠΎ процСссы ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ качСствСнных IT-ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ DDD Ρ€Π°Π΄Π°Ρ€. ΠšΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ состоится 8 июня, Call for Papers ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Π΄ΠΎ 6 апрСля.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Как устроСн Domain-Driven Design

МногиС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π° Django Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ просто: Π΅ΡΡ‚ΡŒ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ крутится Π½Π° сСрвСрС, ΠΈΠ΄ΡƒΡ‚ обращСния. НапримСр, Ρ‚Π°ΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Π»Π°ΡΡŒ Dodo IS (информационная систСма ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π”ΠΎΠ΄ΠΎ ΠŸΠΈΡ†Ρ†Π°, Π³Π΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π» Π°Π²Ρ‚ΠΎΡ€ сСгодняшнСй ΡΡ‚Π°Ρ‚ΡŒΠΈ). Но Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Django ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π±Π΅Π΄ ΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ°Ρ‡ΠΊΡƒ Π°Π½Ρ‚ΠΈΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ². Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ встрСчали Ρ‚Π°ΠΊΠΎΠ΅ Π½Π° старых legacy-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….

Π•Π²Π³Π΅Π½ΠΈΠΉ ПСшков Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ сообщСство DDD-ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ², рассказывая, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Domain-Driven Design (ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅) Π² соврСмСнном ΠΌΠΈΡ€Π΅. На ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ Russian Python Week 2020 ΠΎΠ½ выступил с рассказом ΠΎΠ± этом. ΠšΡΡ‚Π°Ρ‚ΠΈ, 19 августа ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ встрСча DDDevotion-сообщСства, ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ΡΡŒ, Π±ΡƒΠ΄Π΅ΠΌ ΠΎ Ρ‡Π΅ΠΌ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ.

Π’ сСгодняшнСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΅Π³ΠΎ рассказ ΠΏΡ€ΠΎ Ρ‚ΠΎ, ΠΊΠ°ΠΊ устроСн Domain-Driven Design ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ инструмСнты ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ трСбования бизнСса ΠΈ сам бизнСс.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

ΠœΡ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, хотя ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· источников ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ для бизнСс-прилоТСния. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ бизнСс растСт, ΠΈ вслСд Π·Π° Π½ΠΈΠΌ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ систСмы. ΠŸΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅ прилоТСния, ΠΈΡ… становится всё большС. И самоС ΠΏΠ»ΠΎΡ…ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ β€” всС сущности пСрСплСтутся, Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ слоям.

И это Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΡ€ΠΎ Π΄ΠΎΠ»Π³ΠΈΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π±Π΅Π΄Ρ‹ β€” ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ. Π“ΠΎΡ€Π°Π·Π΄ΠΎ Ρ…ΡƒΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ получаСтся Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ β€” Π²Ρ‹ Π½Π΅ смоТСтС Π²Π·ΡΡ‚ΡŒ кусочСк систСмы ΠΈ обособлСнно Π΅Π³ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ. Врогая ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹, Π²Ρ‹ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΡŒ бэк-офис. ΠžΡ‡Π΅Π½ΡŒ нСприятно с Ρ‚Π°ΠΊΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Другая большая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° β€” это ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒ. Π’Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π² application-сСрвисС. Но модСль ΠΊ Π²Π°ΠΌ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΡˆΠ»Π° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π° Π²Ρ‹ Π½Π΅ использовали Π΅Π΅ Π² ΠΏΠΎΠ»Π½ΡƒΡŽ силу.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, нСпонятно, Π³Π΄Π΅ ΠΆΠ΄Π°Ρ‚ΡŒ Null Reference Exception. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ» Π»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ модСль достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΈΠ»ΠΈ Π³Π΄Π΅-Ρ‚ΠΎ остановился ΠΈ Π²Π°ΠΌ Π½Π°Π΄ΠΎ Π²Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ΄, ΠΈΠ»ΠΈ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ тСстами, ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

Но Π΄Π°ΠΆΠ΅ Ссли Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ, всё Ρ€Π°Π²Π½ΠΎ нСпонятно, сколько Π»ΠΈΡˆΠ½ΠΈΡ… Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΉ памяти ΠΌΡ‹ сдСлали для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρƒ нас появился Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. И Π½Π°Π΄ΠΎ Π»ΠΈ ΠΎΠ½ΠΎ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° это сильно влияСт Π½Π° пСрформанс.

И самоС ΠΏΠ»ΠΎΡ…ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅Ρ‚ Π³Ρ€Π°Π½ΠΈΡ† ΠΈ Π½Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ для Π½Π΅Π³ΠΎ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ слишком Ρ€Π°Π·ΠΌΠ°Π·Π°Π½Π½Ρ‹ΠΉ. ДСлая Π½ΠΎΠ²ΡƒΡŽ Ρ„ΠΈΡ‡Ρƒ, Π²Π°ΠΌ придСтся Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ поля, ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΊ ΠΏΠ»ΠΎΡ…ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ.

НапримСр, ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΊΠ°Π· с кассы рСсторана, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΈΡ†Ρ†Ρƒ, Π° ΠΌΡ‹ β€” ΡƒΡ‡Π΅ΡΡ‚ΡŒ ваш Π·Π°ΠΊΠ°Π·. Для кассы ΠΌΡ‹ опрСдСляСм ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ поля. ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ доставкС, ΠΈ Π² ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ°Π·Π° снова добавляСм поля. АдрСс ΠΈ врСмя доставки с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ рСсторану, Π½ΠΎ Ρƒ нас β€” общая модСль Π·Π°ΠΊΠ°Π·Π°.

Π”Π°Π»ΡŒΡˆΠ΅ появляСтся ΡƒΡ‡Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ развиваСмся ΠΈ ΠΏΠΈΠ»ΠΈΠΌ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ, Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ трСбования государства ΠΈ Ρ‚.Π΄. Всё это ΠΎΠΏΡΡ‚ΡŒ добавляСт Π½Π°ΠΌ Π½ΠΎΠ²Ρ‹Π΅ поля. Наша модСль становится монструозной, ΠΊΠ°ΠΊ лСстница Π­ΡˆΠ΅Ρ€Π°: Π² Π½Π΅ΠΉ 30 ΠΏΠΎΠ»Π΅ΠΉ, Π½ΠΎ нСпонятно, ΠΊΠΎΠΌΡƒ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹ ΠΈ ΠΊΠ°ΠΊ Π½Π° это ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ.

РСшСниСм Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π°ΠΊΠ°Π· Π½Π° Ρ‚Ρ€ΠΈ части, Ρ‚Π°ΠΊ ΠΌΡ‹ избавимся ΠΎΡ‚ мусорных ΠΏΠΎΠ»Π΅ΠΉ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρƒ нас Π±ΡƒΠ΄ΡƒΡ‚ сквозныС поля β€” ID, сумма, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Но ΠΏΡ€ΠΈ этом поля, спСцифичныС для ΠΎΠ΄Π½ΠΎΠΉ области знания, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΡΠΎΡ€ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Bounded Context. БтратСгичСский Π΄ΠΈΠ·Π°ΠΉΠ½

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Как ΠΈΡΠΊΠ°Ρ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹

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

Для опрСдСлСния Π³Ρ€Π°Π½ΠΈΡ† ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ β€” Π½Π΅ сами ΠΏΠΎ сСбС, Π° ΠΈΡ… источник. Если Π΄Π°Π½Π½Ρ‹Π΅ приходят ΠΈΠ· Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… источников, Ρ‚ΠΎ, скорСС всСго, здСсь Π΄Π²Π° Bounded Context, Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ этапы бизнСс-процСсса. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΏΠΎΠ²Π΅Π·Π»ΠΈ Π·Π°ΠΊΠ°Π· ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ, ΠΎΠ½ сразу становится Π΄Ρ€ΡƒΠ³ΠΎΠΉ модСлью. И Ρ‚ΠΎΠ³Π΄Π° для ΠΊΡƒΡ€ΡŒΠ΅Ρ€Π° Π·Π°ΠΊΠ°Π· Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Ρ‹ΠΌ, Ρ‡Π΅ΠΌ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° Π²Π΅Π±-сайтС.

Если для Ρ€Π°Π·Π½Ρ‹Ρ… частСй нашСй ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Π΅ΠΌ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… экспСртов, скорСС всСго, Π³Ρ€Π°Π½ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΌ. Π’Π°ΠΊΠΆΠ΅ посмотритС Π½Π° оргструктуру ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” ΠΎΠ½Π° Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Π³Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ ограничСния. И послСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π»ΠΈΡ†Π°. Они ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… этапах, ΠΈ исходя ΠΈΠ· этого, ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‡Π΅Ρ€Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹.

НапримСр, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ с Π±ΡƒΡ…Π³Π°Π»Ρ‚Π΅Ρ€ΠΎΠΌ, ΠΎΠ½ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎ Π·Π°ΠΊΠ°Π· ΠΏΠΈΡ†Ρ†Ρ‹ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ свои Π²Π΅Ρ‰ΠΈ, ΠΈ Π½Π΅ Π½Π°Π΄ΠΎ Π΅Π³ΠΎ Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ»ΠΈ адрСсом доставки. И, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎ Π·Π°ΠΊΠ°Π· Π² контСкстС доставки, Π½Π°ΠΌ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, сколько Π³Ρ€Π°ΠΌΠΌ тСста ΠΈ сыра ΠΌΡ‹ списали Π½Π° Π·Π°ΠΊΠ°Π·.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ контСкст ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΠ°Π· Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ Π½Π° Π΄Π²Π΅ части. Π£ нас получаСтся Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π·Π°ΠΊΠ°Π·ΠΎΠ²:

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

И Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ всСгда ΠΌΠΎΠ³Π»ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ с бизнСсом ΠΈ экспСртами ΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Π² Domain-Driven Design ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ язык.

Π•Π΄ΠΈΠ½Ρ‹ΠΉ язык (Ubiquitous Language)

Π­Ρ€ΠΈΠΊ Эванс Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ описаниС Domain-Driven Design Π² своСй ΠΊΠ½ΠΈΠ³Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ с Π½Π΅Π³ΠΎ. Вся ΡΡƒΡ‚ΡŒ DDD β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ язык ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с экспСртами Π² Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ области, Ρ‡Ρ‚ΠΎΠ±Ρ‹ максимально Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒ бизнСс-Ρ†Π΅Π»ΠΈ.

Π•Π΄ΠΈΠ½Ρ‹ΠΉ язык Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹, понятия, ΠΈ Π΄Π°ΠΆΠ΅ Ρ„Ρ€Π°Π·Ρ‹ для общСния Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅. Основной инструмСнт β€” это Event storming. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π² Domain-Driven Design β€” это Π°Π³Ρ€Π΅Π³Π°Ρ‚, ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ событиС.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Если ΠΊΡ€Π°Ρ‚ΠΊΠΎ, Ρ‚ΠΎ для физичСского Event storming Π½ΡƒΠΆΠ½Ρ‹: большая стСна (10 ΠΌ), стикСры, ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Ρ‹, ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ экспСрты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π½Π° вопросы. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ модСль с Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°ΠΌΠΈ, с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ, с Bounded Context ΠΈ Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ. Π•Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, насколько большая систСма ΠΈ сколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… людСй ΠΌΡ‹ ΠΏΠΎΠ·Π²Π°Π»ΠΈ, насколько Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π΅Π΅ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Π’ Domain-Driven Design это называСтся стратСгичСским Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ ΠΈΠ»ΠΈ стратСгичСскими ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°ΠΌΠΈ. Но сСгодня я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‡ΡƒΡ‚ΡŒ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ΄Ρƒ, ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ тактичСском Π΄ΠΈΠ·Π°ΠΉΠ½Π΅.

ВактичСский Π΄ΠΈΠ·Π°ΠΉΠ½ Domain-Driven Design

Domain-Driven Design β€” Π½Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π°Π½Π΅ΠΌΠΈΡ‡Π½Ρ‹Ρ… ΠΈ дырявых ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. АнСмичныС ΠΌΠΎΠ΄Π΅Π»ΠΈ говорят ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅Ρ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ это такая DTO, которая содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½Ρ‹Π΅. И Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, разумССтся, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ дырявым, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ внСшний Application Services ΠΌΠΎΠ³ Π΅Π³ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ.

Π­Ρ‚ΠΎ достаточно стандартный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Π»ΠΈ. Π£ нас Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄, ΠΈ большая Ρ‡Π°ΡΡ‚ΡŒ Π΅Π³ΠΎ Π»ΠΎΠ³ΠΈΠΊΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. БСрвисы ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ, заполняя ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ поля ΠΈΠ»ΠΈ возвращая ΠΈΠ· сСбя Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½ΠΎ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ β€” дырявыС.

К Ρ‡Π΅ΠΌΡƒ это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚? Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΡ‡Π΅Π½ΡŒ слоТно Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ бизнСс-ΠΏΡ€Π°Π²ΠΈΠ»Π°. Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Application Services ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, добавляя Π΅ΠΌΡƒ мусорных ΠΏΠΎΠ»Π΅ΠΉ. Иногда эти мусорныС поля Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ людьми, ΠΈ Ρ‚ΡƒΠ΄Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ Π½Π΅ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅. ВсС это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² нСсогласованноС состояниС. Если Π±Ρ‹ ΠΌΡ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΡƒΠΌΠ΅Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΡ‹ Π±Ρ‹ часто Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ своСму ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ.

Π­Ρ‚ΠΎ всё ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ (coupling) ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ»Π°Π±ΡƒΡŽ ΠΊΠΎΡ…Π΅Π·ΠΈΡŽ (cohesion), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ Π±Π΅Π· ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ прочтСния ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ°ΠΊ взаимосвязано Π² этой систСмС. Π’Π°ΠΊ ΠΊΠ°ΠΊ кодовая Π±Π°Π·Π° Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… legacy-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ становится ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ, Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ этих связСй.

Π’ противовСс этому Domain-Driven Design ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Rich Domain Model β€” Π±ΠΎΠ³Π°Ρ‚ΡƒΡŽ Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ модСль, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠΌΠΈΠΌΠΎ Π΄Π°Π½Π½Ρ‹Ρ… содСрТит Π² сСбС ΠΈ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ. И Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ этому Π°Π³Ρ€Π΅Π³Π°Ρ‚Ρ‹.

АгрСгаты

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π°Π³Ρ€Π΅Π³Π°Ρ‚? Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ. Π£ Эванса Π΅ΡΡ‚ΡŒ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ описываСт: Value Object ΠΈ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ.

Π‘ΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π˜Π²Π°Π½ΠΎΠ²Ρ‹Ρ… АлСксСя, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ двумя Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ людьми, Π΄Π°ΠΆΠ΅ Ссли Ρƒ Π½ΠΈΡ… ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ поля. Value Object β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, дСньги β€” ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Π°Π»ΡŽΡ‚Ρ‹ ΠΈ amount. И Ссли эти Π΄Π²Π° поля ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Π²Ρ‹ считаСтС, Ρ‡Ρ‚ΠΎ это ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ.

Бущности ΠΈ Value Objects Π² Domain-Driven Design принято ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Π² Π°Π³Ρ€Π΅Π³Π°Ρ‚. ΠŸΡ€ΠΈ этом Π°Π³Ρ€Π΅Π³Π°Ρ‚ доступСн ΠΈΠ·Π²Π½Π΅ ΠΊΠ°ΠΊ API вашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НапримСр, Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈ с Π½ΠΈΠΌ связан наш Π·Π°ΠΊΠ°Π·, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ модСль адрСса. ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ адрСс ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· сам Π·Π°ΠΊΠ°Π·.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°

Π•ΡΡ‚ΡŒ соблазн Π·Π°ΠΏΠΈΡ…Π°Ρ‚ΡŒ всС Π² ΠΎΠ΄ΠΈΠ½ большой Π°Π³Ρ€Π΅Π³Π°Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ всСгда Π±ΡƒΠ΄Π΅Ρ‚ консистСнтным. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ Π² DDD Π΅ΡΡ‚ΡŒ нСгласноС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ. Π’ΠΎΠ½ Π’Π΅Ρ€Π½ΠΎΠ½ настаиваСт, Ρ‡Ρ‚ΠΎ Π°Π³Ρ€Π΅Π³Π°Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎ. Для ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ смартфона, это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Доступ ΠΎΠ΄Π½ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ, ΠΌΡ‹ считали состояниС систСмы с ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, Ρ€Π°Π·Π»ΠΎΠΆΠΈΠ»ΠΈ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Π½ΠΈΠΌ. ΠŸΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ сохранили. Но Π² Π²Π΅Π± ΠΌΡ‹ Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, особСнно ΠΊΠΎΠ³Π΄Π° доступ Π½Π΅ ΠΎΠ΄Π½ΠΎ-, Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ написали свой ЀСйсбук, ΠΈ Ρ‚Π°ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пост β€” это Π°Π³Ρ€Π΅Π³Π°Ρ‚, Π° Π»Π°ΠΉΠΊ β€” Ρ‡Π°ΡΡ‚ΡŒ этого Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π»Π°ΠΉΠΊΠ΅ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ модСль. НС Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π½Π° ΠΆΠ΅Π»Π΅Π·ΠΎ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° большС Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ слоТно ΡΠΎΠ±Π»ΡŽΡΡ‚ΠΈ consistency нашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если Π±Ρ‹Π»ΠΎ поставлСно 5 тысяч Π»Π°ΠΉΠΊΠΎΠ², ΠΌΡ‹ Π² ΠΈΡ‚ΠΎΠ³Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° вьюшкС ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ. Если ΠΆΠ΅ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ, получится concurrency-доступ, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ Π·Π°Ρ‚Π΅Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ измСнСния.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π°Π³Ρ€Π΅Π³Π°Ρ‚ Π²Π°ΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π² транзакциях, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ являСтся Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»Π΅ΠΌ цСлостности, ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Он ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° всю бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ бизнСс-ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² систСмС. Если ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ наш список Π΄Π΅Π», Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ Π² ΠΎΠ΄ΠΈΠ½ Π·Π°Ρ…ΠΎΠ΄, Π° Π² нСсколько, ΠΏΡ€ΠΈ Π»Π°Π³Π΅ сСти ΠΌΡ‹ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° просто Π½Π΅ запишСм, ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚ΠΊΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ нСконсистСнтный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Или, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ список Π·Π°Π΄Π°Ρ‡, пробСгая ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈ спискам. ΠœΡ‹ ΠΈΡ… ΠΏΡ€ΠΈΠΊΠ°ΠΏΡ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ быстро Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° вьюшки, Π½ΠΎ ΠΏΡ€ΠΈ сохранСнии ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° с 10 тысячами Π·Π°Π΄Π°Ρ‡ ΠΌΡ‹ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ сохраним, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 9999. Π’Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² соцсСтях, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ поставлСнных Π»Π°ΠΉΠΊΠ°/notification, Π° Π·Π°Ρ…ΠΎΠ΄ΠΈΡˆΡŒ Π² notification β€” ΠΈ ΠΈΡ… Ρ‚Π°ΠΌ Π½Π΅Ρ‚. Π­Ρ‚Π° Π½Π΅ΠΊΠΎΠ½ΡΠΈΡΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π² транзакциях.

Но ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ β€” это ΠΎΡ‡Π΅Π½ΡŒ Π΄ΠΎΡ€ΠΎΠ³ΠΎ. И здСсь ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Outbox Pattern Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Eventual Consistency (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ согласованности), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π½Π΅ вСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сразу, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ, отправляя ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π½Π°ΡˆΡƒ ΡˆΠΈΠ½Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Bounded Context.

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Outbox Pattern

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ schedulerΒ΄Π°. НапримСр, TODO-листы Π² Π½Π΅ΠΌ Π»Π΅ΠΆΠ°Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, ΠΈ Π΅ΡΡ‚ΡŒ Π΄Π²Π° сСрвиса: ΠΎΠ΄ΠΈΠ½ занимаСтся Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ расписания, Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ TODO-листов. Π”Π²Π° сСрвиса β€” это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎ ΠΌΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΠ½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ инстанса, Π½ΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ связаны Π½ΠΈ ΠΏΠΎ storage, Π½ΠΈ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ, ΠΈΠ»ΠΈ связаны минимально. Если ΠΌΡ‹ свяТСм ΠΈΡ… ΠΏΠΎ Π±Π°Π·Π΅, Ρ‚ΠΎ Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‚Ρ€Π΅Ρ‚, ΠΈ это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΈΡ… нСконсистСнтности.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сущСствуСт Outbox Pattern. Π•Π³ΠΎ достаточно простая рСализация Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ scheduler, ΠΏΠΎΠΌΠΈΠΌΠΎ своСй Π‘Π”, Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ RabbitMQ. Випичная рСализация β€” ΠΌΡ‹ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² свою Π±Π°Π·Ρƒ, ΠΈ ΠΊΠΈΠ½ΡƒΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ событиС Π² RabbitMQ. Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΡΠ΅Ρ‚ΡŒ ΠΌΠΎΡ€Π³Π½Π΅Ρ‚, своя Π‘Π” станСт нСдоступна Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя, ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ нСсогласованноС состояниС.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π² ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ пишСм Π² Π‘Π” Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½ΠΎ ΠΈ событиС, Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΈΠ²Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΊΠΈΠ½ΡƒΡ‚ΡŒ Π² RabbitMQ. ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ обращаСмся ΠΊ RabbitMQ. Если ΠΎΠ½ Π½Π΅ доступСн, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ publisher, ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ слой, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ смотрит, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Π² Π‘Π”, ΠΈ отправляСт.

ЕстСствСнно, здСсь пСриодичСски Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ дупликация событий, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ Π½Π΅ всСгда ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ ΠΌΡ‹ Π² RabbitMQ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ. Иногда Π΅Ρ‰Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ reordering, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π½Π΅ Π² Ρ‚ΠΎΠΌ порядкС ΠΏΠΈΡΠ°Ρ‚ΡŒ.

Π•ΡΡ‚ΡŒ нСсколько ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ. RabbitMQ частично ΡƒΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ reordering. Но наш ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ β€” это ΠΏΡ€ΠΈ использовании RabbitMQ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ событиям ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ€Π°Π·Π½ΠΎΠΌ порядкС, Π² Π΄Π²ΠΎΠΉΠ½ΠΎΠΌ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ для нас ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ событиС Π±Ρ‹Π»ΠΎ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½Ρ‹ΠΌ ΠΈ ΠΊΠΎΠΌΠΌΡƒΡ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ. ΠœΡ‹ Π½Π΅ смотрим Π½Π° порядок ΠΈ количСство, Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ путями β€” использованиСм, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, correlation key.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ сильно ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… прилоТСниях. НапримСр, Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях люди большС Ρ‡ΠΈΡ‚Π°ΡŽΡ‚, Ρ‡Π΅ΠΌ ΠΏΠΈΡˆΡƒΡ‚. И Π‘Π” ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΠ΄ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎ. Π›ΠΈΠ±ΠΎ ΠΌΡ‹ позволяСм людям быстро ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π½Π°ΠΌ слоТно Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ это всС ΠΈ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ людям. Π›ΠΈΠ±ΠΎ ΠΌΡ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΠ΄ быстроС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, Π½ΠΎ Π΄ΠΎΠ»Π³ΠΎ записываСм. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ trade-off Π² соврСмСнных storage. КакиС-Ρ‚ΠΎ storage Ρ€Π΅ΡˆΠ°ΡŽΡ‚ эту Π·Π°Π΄Π°Ρ‡Ρƒ ΡƒΡΠΏΠ΅ΡˆΠ½Π΅Π΅, ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ модСль Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ»ΠΈ Π½Π° Π΄Π²Π΅: Write ΠΈ Read. Π’Π°ΠΊ появился CQRS.

Π­Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π°ΠΌ ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΠ±Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΈ Write, ΠΈ Read. НапримСр, ΠΊΠΎΠ³Π΄Π° ΠΈΠ· прилоТСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° запись ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΌΡ‹ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CQRS ΠΌΡ‹ раздСляСм ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° запись ΠΈ запросы Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅. И Π² этом случаС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ эти Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Если Ρƒ нас ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ чтСния, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ модСль Read β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ рядом нСсколько сСрвСров. Π’Π°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Read-модСль ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Event Sourcing

Π—Π΄Π΅ΡΡŒ идСя Ρ‚ΠΎΠΆΠ΅ простая. ΠœΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π½Π΅ state нашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ события, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ этот state ΠΌΠ΅Π½ΡΡŽΡ‚. ΠžΡ‡Π΅Π½ΡŒ явно ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² бухгалтСрском ΡƒΡ‡Π΅Ρ‚Π΅. Π’Π°ΠΌ ΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ мСняСм состояниС. ΠœΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ append-only ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡ‚ этого ΠΊΡƒΡ‡Ρƒ Π±Π΅Π½Π΅Ρ„ΠΈΡ‚ΠΎΠ². Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ state, Π½ΠΎ ΠΈ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΊ этому state ΠΏΡ€ΠΈΡˆΠ»ΠΈ. Если Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅ просто, Ρ‡Ρ‚ΠΎ Π½Π° Π½Π΅ΠΌ Π»Π΅ΠΆΠΈΡ‚ 100 Ρ€ΡƒΠ±Π»Π΅ΠΉ, Π° ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ эти дСньги накопились.

Event Sourcing ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС эти малСнькиС измСнСния, ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ шаг. Π”Π°Π»ΡŒΡˆΠ΅ происходит достаточно простая Π²Π΅Ρ‰ΡŒ: ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ, ΠΌΡ‹ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ всС события, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ с Π½ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΈ.

Как ΠΌΡ‹ конструируСм ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚? На запрос ΠΊΠ°ΠΊΠΎΠ³ΠΎ счСта ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ просто Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ баланс ΠΈ ΠΎΡ‚Π΄Π°Π΅ΠΌ Π½Π°Ρ€ΡƒΠΆΡƒ. Π’ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ Event Sourcing ΠΌΡ‹ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π½Π΅ баланс, Π° эвСнты. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ ΠΏΠΎΠ΄Π°Π΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ эвСнты Π½Π° Π²Ρ…ΠΎΠ΄ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ эти эвСнты ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π³ΠΎΠ»ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.

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

А Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡ‚ Event Sourcing Π»Π΅Π³ΠΊΠΎΠ΅ исправлСниС ошибок. Π― с Ρ‚Π°ΠΊΠΈΠΌ сталкивался. НапримСр, ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ошибся ΠΈ написал Π² ΠΊΠΎΠ΄Π΅ минус вмСсто плюса. Π’ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅, Π³Π΄Π΅ ΠΌΡ‹ пишСм state ΠΈ баланс Π² Π±Π°Π·Ρƒ, ΠΌΡ‹ Π±Ρ‹ устали Π²Ρ‹Ρ‡ΠΈΡ‰Π°Ρ‚ΡŒ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ. Нам Π±Ρ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π²Ρ‹ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€ΡƒΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ.

Если Ρƒ нас Event Sourcing, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ – достаточно ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π½ΠΎΠ²ΠΎ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ события Ρƒ нас ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅, Π½ΠΎ ΠΌΡ‹ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ ΠΌΡ‹ исправили, Ρ‚ΠΎ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΎΠΆΠ΅ становится ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΊΡ€ΡƒΡ‚ΠΎΠΉ Π±Π΅Π½Π΅Ρ„ΠΈΡ‚.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Event Sourcing Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ большой нСдостаток β€” это пСрформанс. Если банковская систСма с ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄ΠΎΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ эвСнты, ΠΏΡƒΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ, ΡˆΠ°Ρ€Π΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΏΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, это Π±ΡƒΠ΄Π΅Ρ‚ всё Ρ€Π°Π²Π½ΠΎ Π΄ΠΎΡ€ΠΎΠ³ΠΎ. А Ссли ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ High Performance Trading, Π³Π΄Π΅ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Ρ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΡ… событий ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство.

Π‘Ρ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ тяТСло, ΠΈ Π² DDD ΠΏΡ€ΠΈΠΆΠΈΠ»Π°ΡΡŒ идСя ΡΠΊΠ»Π΅ΠΈΡ‚ΡŒ Event Sourcing ΠΈ CQRS.

CQRS ΠΈ Event Sourcing

ВСрнСмся ΠΊ модСлям чтСния ΠΈ записи. Write-модСль β€” это Ρ‚Π΅ события, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΈΠ· прилоТСния. Баланс ΠΏΠΎΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ, осущСствился ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄, сняли дСньги, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΡˆΡ‚Ρ€Π°Ρ„, ΠΎΠΏΠ»Π°Ρ‚ΠΈΠ» комиссию, Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ. Π­Ρ‚ΠΎ всё сыпСтся Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π² ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ append-only Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ это Π΄Π°ΠΆΠ΅ Π½Π΅ рСляционная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ΄ запись, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Kafka. Она позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ большоС количСство событий ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ с этим справляСтся.

Π”Π°Π»ΡŒΡˆΠ΅ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ наши ΠΈΠ²Π΅Π½Ρ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· свою бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ ΡƒΠΆΠ΅ Π² Read-модСль. Π’Π°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ быстрыС ΠΈ запись, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅. ЕдинствСнный нСдостаток β€” Π² Event Sourcing ΠΈ CQRS ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ read-your-own-writes, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ своСй записи. Π›Π°Π³ ΠΌΠ΅ΠΆΠ΄Ρƒ записью ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ самого сСбя ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ большим, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ этими модСлями eventual consistency, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ запись Π² Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π£ нас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ подписан Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π±Ρ€ΠΎΠΊΠ΅Ρ€-сообщСниС β€” Π½Π° Ρ‚ΠΎΠΏΠΈΠΊ Kafka ΠΈΠ»ΠΈ Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π² RabbitMQ. ΠžΡ‚Ρ‚ΡƒΠ΄Π° Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π°ΡŽΡ‚ увСдомлСния ΠΎ Π½ΠΎΠ²Ρ‹Ρ… событиях. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π»ΠΎ событиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Π½Π΅ совсСм событиС, Π½ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ° такая ΠΆΠ΅.

Π§Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ? Из Read ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π°Π³Ρ€Π΅Π³Π°Ρ‚, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ наш Π°Π³Ρ€Π΅Π³Π°Ρ‚. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Π·Π°ΠΊΠ°Π·Π΅. ΠœΡ‹ добавляСм Π² модСль Π΄Π²Π° поля: Π²Π΅Ρ€ΡΠΈΡŽ ΠΈ IsDirty β€” ΠΏΠΎΡ‚Ρ€ΠΎΠ³Π°Π»ΠΈ Π»ΠΈ ΠΌΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΠ΅Ρ€ΠΆΠΈΠΌ событиС с нашим Π°Π³Ρ€Π΅Π³Π°Ρ‚ΠΎΠΌ. ΠŸΠΎΠΏΡƒΡ‚Π½ΠΎ ΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ событиС для ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Outbox Pattern. Оно сохранится, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Bounded Context Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. ПослС этого ΠΌΡ‹ сохраняСм Π°Π³Ρ€Π΅Π³Π°Ρ‚ ΠΈ событиС.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΉΡ‚ΠΈ Π½Π΅ Ρ‚Π°ΠΊ? Π£ событий ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠΆΠ΅ Π²Π΅Ρ€ΡΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ. Но эта Π²Π΅Ρ€ΡΠΈΠΎΠ½Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ это событиС ΠΈΠ»ΠΈ просто Π΅Π³ΠΎ Π²Ρ‹ΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ.

Из Read ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π°Π³Ρ€Π΅Π³Π°Ρ‚, ΠΌΠ΅Ρ€ΠΆΠΈΠΌ Π΅Π³ΠΎ с Π½ΠΎΠ²Ρ‹ΠΌ событиСм ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅, ΠΎΡ‚ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅ΠΌ староС, дСлая Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ соблюдая ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ, Π° ΠΏΠΎΡ‚ΠΎΠΌ сохраняСм Π°Π³Ρ€Π΅Π³Π°Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ.

ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅. Π€ΠΎΡ‚ΠΎ ddd ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ concurrency. Π’ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… систСмах Ρ…Π΅Π½Π΄Π»Π΅Ρ€ Ρ‚ΠΎΡ‡Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ ΠΎΠ΄ΠΈΠ½. Если Π²Ρ‹ ΠΏΡ€ΠΎ это Π½Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‚ΠΎ всё просто Ρ€Π°Π·ΡŠΠ΅Π΄Π΅Ρ‚ΡΡ. НапримСр, Π²Ρ‹ Π·Π°Ρ‚Ρ€Π΅Ρ‚Π΅ послСдним Π°ΠΏΠ΄Π΅ΠΉΡ‚ΠΎΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ измСнСния.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π»ΠΈΠ±ΠΎ явно Π»ΠΎΡ‡ΠΈΠΌ Π½Π°ΡˆΡƒ запись, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ pessimistic concurrency, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ optimistic concurrency, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π΄ сохранСниСм провСряСм Π²Π΅Ρ€ΡΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ сохраняСм Π² Π±Π°Π·Ρƒ ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π°ΠΏΠ΄Π΅ΠΉΡ‚ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с вСрсиСй 4. Если Π²Π΄Ρ€ΡƒΠ³ Π² Π±Π°Π·Π΅ Π»Π΅ΠΆΠΈΡ‚ ΡƒΠΆΠ΅ 5 ΠΈΠ»ΠΈ 6 вСрсия, ΠΌΡ‹ ΠΏΠ°Π΄Π°Π΅ΠΌ с exception optimistic concurrency (это ΠΌΡ‹ Ρ‚Π°ΠΊ Π² ΠΊΠΎΠ΄Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ), ΠΈ Ρ†ΠΈΠΊΠ» повторяСтся Π·Π°Π½ΠΎΠ²ΠΎ.

Π’ Π½ΠΎΠ²ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ ΠΌΡ‹ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π°Π³Ρ€Π΅Π³Π°Ρ‚ Π·Π°Π½ΠΎΠ²ΠΎ, ΡƒΠΆΠ΅ с вСрсиСй 6, ΠΈ ΠΎΠΏΡΡ‚ΡŒ ΠΌΠ΅Ρ€ΠΆΠΈΠΌ событиС. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Ссли ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· ΠΎΠ½ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ€ΠΆΠΈΠ»ΠΎΡΡŒ, Ρ‚ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· всё ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΉΡ‚ΠΈ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ состояниС помСнялось, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π΅Π³ΠΎ ΡƒΠΆΠ΅ нСльзя ΠΌΠ΅Ρ€ΠΆΠΈΡ‚ΡŒ. Π’ зависимости ΠΎΡ‚ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅. И сохраняСм ΠΎΠΏΡΡ‚ΡŒ, провСряя, Π° ΡˆΠ΅ΡΡ‚ΡƒΡŽ Π»ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΡ‹ обновляСм? Если Π΄Π°, ОК, сохранили. Если Π½Π΅Ρ‚ (Ρƒ нас всС быстро мСняСтся), Ρ‚ΠΎ повторяСм.

Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΌΡ‹ успСваСм ΠΌΠ΅ΠΆΠ΄Ρƒ измСнСниями ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ. Π£ нас Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ пСрформанс, ΠΊΠ°ΠΊ Π² Badoo, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ событий ΠΌΠΎΠΆΠ΅Ρ‚ Π² ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π°Ρ‚ΡŒ. Π£ нас Π² систСмС ΠΌΠ°Π»ΠΎ людСй ΠΌΠ΅Π½ΡΡŽΡ‚ мноТСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠ΅Π½ΡΡŽΡ‚ 1-2 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. БоотвСтствСнно, Ρƒ нас Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅Π΄ΠΊΠΈ, Π½ΠΎ ΠΌΡ‹ ΠΎ Π½ΠΈΡ… ΠΏΠΎΠΌΠ½ΠΈΠΌ.

Π§Π΅ΠΌ Π½Π°ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Bounded Context? Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ½ сниТаСт ΠΊΠΎΠ³Π½ΠΈΡ‚ΠΈΠ²Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΎΡ‚ Ρ€Π°Π·Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². ОсобСнно Ссли Ρƒ вас систСма достаточно большая. НапримСр, Ρƒ нас Dodo IS сСйчас ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° 30-50 Ρ€Π°Π·Π½Ρ‹Ρ… сСрвисов. Π― Π½Π΅ знаю ΠΈΡ… всС, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ постоянно ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΠ²Ρ‹Π΅. Но ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Bounded Context, я сниТаю пятно ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π°, ΠΈ Π·Π° счСт этого Π±ΠΎΠ»Π΅Π΅ сфокусировано Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΡ„ΠΈΡ‚. Когда Ρƒ вас понятный Π°Π³Ρ€Π΅Π³Π°Ρ‚ с ясными ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ с бизнСсом ΠΈΠ»ΠΈ экспСртами ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· своСго фокуса. Π’Π°ΠΊ Π²Ρ‹ создадитС мСньшС ошибок Π² бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅.

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Domain-Driven Design ΠΈ всСго Π΅Π³ΠΎ тактичСскиС ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ рост стоимости Π½Π΅ уходящим Π² ΠΏΠΎΡ‚ΠΎΠ»ΠΎΠΊ ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠΉ Ρ„ΠΈΡ‡ΠΈ, Π° растущим постСпСнно. ΠžΡ‚ роста стоимости Π²Ρ‹ совсСм Π½Π΅ ΠΈΠ·Π±Π°Π²ΠΈΡ‚Π΅ΡΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ вас ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Ρ‹, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ ΠΈ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅. Но ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ хотя Π±Ρ‹ Π½Π΅ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ роста.

ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ конфСрСнция для Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ 27 ΠΈ 28 сСнтября Π² МосквС. РасписаниС ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ, Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ самыС интСрСсныС Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΆΠ΅ сСгодня.

Π‘ΠΈΠ»Π΅Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΡƒΠΏΠΈΡ‚ΡŒ здСсь. Π”ΠΎ встрСчи Π² ΠΎΡ„Π»Π°ΠΉΠ½-сСнтябрС!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

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

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *