
ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ° Π·Π°ΡΠΎ Π² ΠΠ²ΠΈΡΠΎ ΠΈΠ·Π±ΡΠ°Ρ ΠΌΠ΅ Kafka ΠΏΡΠ΅Π΄ΠΈ Π΄Π΅Π²Π΅Ρ ΠΌΠ΅ΡΠ΅ΡΠ° ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΡΡ. Π©Π΅ ΡΠΏΠΎΠ΄Π΅Π»Ρ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠ»ΡΡΠ°ΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β Π±ΡΠΎΠΊΠ΅Ρ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ. Π Π½Π°ΠΊΡΠ°Ρ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Kafka as a Service.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°

ΠΡΡΠ²ΠΎ, ΠΌΠ°Π»ΠΊΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. ΠΡΠ΅Π΄ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π°ΠΏΠΎΡΠ½Π°Ρ ΠΌΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΠ΄Π°Π»Π΅ΡΠ°Π²Π°ΠΌΠ΅ ΠΎΡ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ½Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π² ΠΠ²ΠΈΡΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠΎΡΠΈΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ. Π’Π΅ ΠΈΠΌΠ°Ρ ΡΠ²ΠΎΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°, ΡΠ²ΠΎΠΉ ΡΡΠ΅ΠΊ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π·Π° ΡΠ²ΠΎΡΡΠ° ΡΠ°ΡΡ ΠΎΡ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ°.
ΠΠ΄Π½Π° ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Ρ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΡΡΠ»ΡΠ³ΠΈ Π΅ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΡΠ°. Π£ΡΠ»ΡΠ³Π° Π ΡΠ΅ΡΡΠΎ ΠΈΡΠΊΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Ρ ΠΊΠΎΡΡΠΎ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π° ΡΡΠ»ΡΠ³Π° Π. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΡΡΠ»ΡΠ³Π° Π ΡΠ΅ ΠΎΠ±ΡΡΡΠ° ΠΊΡΠΌ ΡΡΠ»ΡΠ³Π° Π ΡΡΠ΅Π· ΡΠΈΠ½Ρ ΡΠΎΠ½Π΅Π½ API. Π£ΡΠ»ΡΠ³Π° Π ΠΈΡΠΊΠ° Π΄Π° Π·Π½Π°Π΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΠ°Π²Π° Ρ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π ΠΈ Π, Π° ΡΠ΅, ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π°, ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°Ρ ΠΎΡ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π ΠΈ Π. ΠΠΎΠ³Π°ΡΠΎ ΡΠ°ΠΊΠΈΠ²Π° βΠ»ΡΠ±ΠΎΠΏΠΈΡΠ½ΠΈβ ΡΡΠ»ΡΠ³ΠΈ ΡΡΠ°Π½Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ, Π²ΡΡΠ·ΠΊΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΡΠ°Ρ Π² Π·Π°ΠΏΠ»Π΅ΡΠ΅Π½ ΠΊΠ»ΡΠ±ΠΎΠΊ.
Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅, Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ»ΡΠ³Π° Π ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°Π½Π΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π°. ΠΠ°ΠΊΠ²ΠΎ Π΄Π° ΠΏΡΠ°Π²ΠΈ ΡΡΠ»ΡΠ³Π° Π ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΡΡΠ»ΡΠ³ΠΈ, ΠΊΠΎΠΈΡΠΎ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π½Π΅Ρ? Π Π°ΠΊΠΎ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π±ΠΈΠ·Π½Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈ Π²Π΅ΡΠΈΠ³Π° ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΠ° Π·Π° ΠΎΡΠΊΠ°Π· Π½Π° ΡΡΠ»Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠ°Π²Π° ΠΎΡΠ΅ ΠΏΠΎ-Π²ΠΈΡΠΎΠΊΠ° (ΠΈ ΡΡ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-Π²ΠΈΡΠΎΠΊΠ°, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎ-Π΄ΡΠ»Π³Π° Π΅ ΡΠ°Π·ΠΈ Π²Π΅ΡΠΈΠ³Π°).
ΠΠ·Π±ΠΎΡ Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ

ΠΠΎΠ±ΡΠ΅, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ ΡΠ° ΡΡΠ½ΠΈ. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ ΠΎΡΡΡΡΠ°Π½ΠΈΠΌ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ»ΡΠ³ΠΈΡΠ΅. Π‘Π΅Π³Π° Π½Π° Π²ΡΡΠΊΠ° ΡΡΠ»ΡΠ³Π° Ρ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° Π·Π½Π°Π΅ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΡΠ°ΠΌΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²Π° ΠΈ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π°Π²Π°ΡΠΈΠΈ Π΄Π° ΡΡΠ±ΠΈΡΠ° Π±ΡΡΠ΅Ρ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°.
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° Π΄ΠΎΡΡΠ°Π²ΠΊΠ°ΡΠ° Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ° ΡΠΎΠ²Π° ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊΠ²ΠΈ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈΡ ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΡ Π½Π΅Ρ:
- ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π³ΡΠ±ΡΡ;
- ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΠ°Ρ;
- ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΠΈ ΡΠ΅ΡΠ°Ρ Π·Π° Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π° ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄Π½ΠΈ (ΠΏΠΎΡΡΠΎΡΠ½Π΅Π½ Π±ΡΡΠ΅Ρ);
- ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π°Π±ΠΎΠ½ΠΈΡΠ°Ρ Π·Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΈΠΌ Π΄Π°Π½Π½ΠΈ;
- Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ»ΡΠ³ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ΡΠ°Ρ Π΅Π΄Π½ΠΈ ΠΈ ΡΡΡΠΈ Π΄Π°Π½Π½ΠΈ;
- ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ°Ρ Π΄Π΅ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½, ΠΎΠ±Π΅ΠΌΠ΅Π½ payload (event-carried state transfer);
- ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΅ Π½ΡΠΆΠ½Π° Π³Π°ΡΠ°Π½ΡΠΈΡ Π·Π° ΡΠ΅Π΄Π° Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ°.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π±Π΅ΡΠ΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠ° ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Ρ Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΏΡΡΠΊΠ½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ (Π½Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ 100k ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΡΠ°Π·ΠΌΠ΅Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡΠ° Π½Π° ΡΠ΅ΠΊΡΠ½Π΄Π°).
ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΡΠ΅ ΡΠ±ΠΎΠ³ΡΠ²Π°Ρ ΠΌΠ΅ Ρ RabbitMQ (ΡΡΡΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈ ΡΡΠ°Π±ΠΈΠ»Π½Π° ΠΏΡΠΈ Π²ΠΈΡΠΎΠΊΠΈ rps), PGQ ΠΎΡ SkyTools (Π½Π΅ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π±ΡΡΠ· ΠΈ ΡΡΡΠ΄Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌ) ΠΈ NSQ (Π½Π΅ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ΅Π½). ΠΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Π½ΠΈ, Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠΆΠ΄Π°Ρ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π·Π°ΠΏΠΎΡΠ½Π°Ρ ΠΌΠ΅ Π΄Π° ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π½ΠΎΠ²ΠΈ Π·Π° Π½Π°Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ β Apache Kafka, Apache Pulsar ΠΈ NATS Streaming.
ΠΡΡΠ²ΠΈ ΠΎΡΡ Π²ΡΡΠ»ΠΈΡ ΠΌΠ΅ Pulsar. Π Π΅ΡΠΈΡ ΠΌΠ΅, ΡΠ΅ Kafka ΠΈ Pulsar ΡΠ° Π΄ΠΎΡΡΠ° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ. Π Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Pulsar Π΅ ΡΠ΅ΡΡΠ²Π°Π½ ΠΎΡ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΠΏΠΎ-Π½ΠΎΠ² Π΅ ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΏΠΎ-Π½ΠΈΡΠΊΠ° Π»Π°ΡΠ΅Π½ΡΠ½ΠΎΡΡ (Π² ΡΠ΅ΠΎΡΠΈΡ), ΡΠ΅ΡΠΈΡ ΠΌΠ΅ ΠΎΡ ΡΠ΅Π·ΠΈ Π΄Π²Π΅ Π΄Π° ΠΎΡΡΠ°Π²ΠΈΠΌ Kafka, ΠΊΠ°ΡΠΎ de facto ΡΡΠ°Π½Π΄Π°ΡΡ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π·Π°Π΄Π°ΡΠΈ. ΠΠ΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ Apache Pulsar Π² Π±ΡΠ΄Π΅ΡΠ΅.
Π ΡΠ°ΠΊΠ°, ΠΎΡΡΠ°Π½Π°Ρ Π° Π΄Π²Π°ΠΌΠ° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΈ: NATS Streaming ΠΈ Apache Kafka. ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΏΡΠΎΡΡΠΈΡ ΠΌΠ΅ ΠΈ Π΄Π²Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΈ ΠΈ Π΄Π²Π΅ΡΠ΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π½Π° Π·Π°Π΄Π°ΡΠ°ΡΠ°. ΠΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ ΠΏΡΠΈΡΠ΅ΡΠ½ΠΈΡ ΠΌΠ΅ ΠΎΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ»Π°Π΄ΠΎΡΡ Π½Π° NATS Streaming (ΠΈ ΠΎΡ ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ, Tyler Treat, ΡΠ΅ΡΠΈ Π΄Π° Π½Π°ΠΏΡΡΠ½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ β Liftbridge). Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ΠΆΠΈΠΌΡΡ Π½Π° Clustering Π½Π° NATS Streaming Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠ΅ ΡΠΈΠ»Π½ΠΎ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ (Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π²Π΅ΡΠ΅ Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ»Π΅Π΄ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠ°Π½Π΅ ΠΏΡΠ΅Π· 2017 Π³ΠΎΠ΄ΠΈΠ½Π°).
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, NATS Streaming Π΅ ΡΡΡΠ°Ρ ΠΎΡΠ½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Go ΠΈ ΠΈΠΌΠ°ΡΠ° ΠΏΠΎΠ΄ΠΊΡΠ΅ΠΏΠ°ΡΠ° Π½Π° Cloud Native Computing Foundation. ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Apache Kafka, ΡΡ Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ Zookeeper Π·Π° ΡΠ°Π±ΠΎΡΠ° (Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ ), ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΡΡΠ΅ΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° RAFT. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ NATS Streaming Π΅ ΠΏΠΎ-Π»Π΅ΡΠ΅Π½ Π·Π° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠ°Π½Π΅. ΠΠ΅ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°ΠΌΠ΅, ΡΠ΅ Π² Π±ΡΠ΄Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΊΡΠΌ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ.
Π Π²ΡΠ΅ ΠΏΠ°ΠΊ, Π΄Π½Π΅Ρ Π½Π°ΡΠΈΡΡ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π» ΡΡΠ°Π½Π° Apache Kafka. Π Π½Π°ΡΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅ ΡΡ ΠΏΠΎΠΊΠ°Π·Π° ΡΠ΅Π±Π΅ ΡΠΈ ΠΊΠ°ΡΠΎ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π±ΡΡΠ·Π° (Π½Π°Π΄ Π΅Π΄ΠΈΠ½ ΠΌΠΈΠ»ΠΈΠΎΠ½ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π° Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Π·Π°ΠΏΠΈΡ ΠΏΡΠΈ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° ΠΎΡ 1 ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ), Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π½Π°Π΄Π΅ΠΆΠ΄Π½Π°, Π΄ΠΎΠ±ΡΠ΅ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠ° ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π° ΠΎΡ ΠΎΠΏΠΈΡ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΡΠ° ΠΎΡ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Kafka ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΏΠΎΠ½Π΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΡΡΠ³ΠΎΠ²ΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° Confluent), Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° Kafka ΠΈΠΌΠ° ΡΠ°Π·Π²ΠΈΡΠ° Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ°.
ΠΡΠ΅Π³Π»Π΅Π΄ Π½Π° Kafka
ΠΡΠ΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ, Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ°ΠΌ ΠΎΡΠ»ΠΈΡΠ½Π° ΠΊΠ½ΠΈΠ³Π° β Β«Kafka: The Definitive GuideΒ» (ΠΈΠΌΠ° ΠΈ Π½Π° ΡΡΡΠΊΠΈ, Π½ΠΎ ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ Π±ΡΡΠΊΠ°Ρ ΠΌΠΎΠ·ΡΠΊΠ°). Π Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π·Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° Kafka ΠΈ Π΄ΠΎΡΠΈ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅. Π‘Π°ΠΌΠ°ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΎΡ Apache ΠΈ Π±Π»ΠΎΠ³ΡΡ Π½Π° Confluent ΡΡΡΠΎ ΡΠ° ΠΎΡΠ»ΠΈΡΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ ΠΈ Π»Π΅ΡΠ½ΠΎ ΡΠ΅ΡΠΈΠΌΠΈ.
Π ΡΠ°ΠΊΠ°, Π½Π΅ΠΊΠ° Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π½Π° Kafka ΠΎΡ Π²ΠΈΡΠΎΡΠΈΠ½Π° Π½Π° ΠΏΡΠΈΡΠΈ ΠΏΠΎΠ³Π»Π΅Π΄. ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡ Π½Π° Kafka ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ producer, consumer, broker ΠΈ zookeeper.
ΠΡΠΎΠΊΠ΅Ρ

ΠΠ°Π΄ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²Π°ΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π±ΡΠΎΠΊΠ΅ΡΡΡ (broker). ΠΡΠΈΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² Π±ΠΈΠ½Π°ΡΠ΅Π½ Π²ΠΈΠ΄, Π° Π±ΡΠΎΠΊΠ΅ΡΡΡ Π·Π½Π°Π΅ ΠΌΠ°Π»ΠΊΠΎ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π°Ρ ΡΠ΅ ΠΈ ΠΊΠ°ΠΊΠ²Π° Π΅ ΡΡΡ Π½Π°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ°.
ΠΡΠ΅ΠΊΠΈ Π»ΠΎΠ³ΠΈΡΠ΅Π½ ΡΠΈΠΏ ΡΡΠ±ΠΈΡΠΈΡ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π² ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ΅ΠΌΠ° (topic). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π° Π² ΡΠ΅ΠΌΠ°ΡΠ° item.created, Π° ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ Π·Π° Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ β Π² item.changed. Π’Π΅ΠΌΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ ΠΊΠ°ΡΠΎ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ. ΠΠ° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠ΅ΠΌΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ°ΠΊΠΈΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΊΠ°ΡΠΎ:
- ΠΎΠ±Π΅ΠΌ Π½Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΈ/ΠΈΠ»ΠΈ ΡΠ΅Ρ Π½ΠΈΡΡ Π²ΡΠ·ΡΠ°ΡΡ (retention.bytes, retention.ms);
- ΡΠ°ΠΊΡΠΎΡ Π½Π° ΠΈΠ·Π»ΠΈΡΡΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ (replication factor);
- ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° Π΅Π΄Π½ΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ (max.message.bytes);
- ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ Π±ΡΠΎΠΉ ΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ Π² ΡΠ΅ΠΌΠ°ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΈΡΠ°Ρ Π΄Π°Π½Π½ΠΈ (min.insync.replicas);
- Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° failover Π½Π° Π½Π΅ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π° ΠΈΠ·ΠΎΡΡΠ°Π²Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ° Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½Π° Π·Π°Π³ΡΠ±Π° Π½Π° Π΄Π°Π½Π½ΠΈ (unclean.leader.election.enable);
- ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ ().
ΠΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π°, Π²ΡΡΠΊΠ° ΡΠ΅ΠΌΠ° ΡΠ΅ ΡΠ°Π·Π±ΠΈΠ²Π° Π½Π° Π΅Π΄Π½Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ (partition). ΠΠΌΠ΅Π½Π½ΠΎ Π² ΠΏΠ°ΡΡΠΈΡΠΈΡΡΠ° Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΠΏΠΎΠΏΠ°Π΄Π°Ρ ΡΡΠ±ΠΈΡΠΈΡΡΠ°. ΠΠΊΠΎ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΅Π΄ΠΈΠ½ Π±ΡΠΎΠΊΠ΅Ρ, ΠΏΠ°ΡΡΠΈΡΠΈΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠΈΡΠΊΠΈ Π±ΡΠΎΠΊΠ΅ΡΠΈ (Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ), ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π·Π°ΠΏΠΈΡ ΠΈ ΡΠ΅ΡΠ΅Π½Π΅ Π² Π΅Π΄Π½Π° ΡΠ΅ΠΌΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π±ΡΠΎΠΊΠ΅ΡΠ° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΠ° Π΄ΠΈΡΠΊΠ° Π΄Π°Π½Π½ΠΈΡΠ΅ Π·Π° Π²ΡΡΠΊΠ° ΠΏΠ°ΡΡΠΈΡΠΈΡ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΈ, ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΠ°Π²Π½ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ (ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΎ ΡΡΠ΅Π· log.segment.bytes). ΠΠ°ΠΆΠ½Π° ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡ β ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΏΠ°ΡΡΠΈΡΠΈΠΈΡΠ΅ (ΠΏΡΠΈ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Π½Π΅ Π½Π° retention) ΡΡΠ°Π²Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΈ (Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ΅ Π΅Π΄Π½ΠΎ ΡΡΠ±ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΠ°ΡΡΠΈΡΠΈΡΡΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ΅ ΡΠ°ΠΌΠΎ ΡΠ΅Π»ΠΈΡΡ ΡΠ΅Π³ΠΌΠ΅Π½Ρ, ΠΈ ΡΠΎ ΡΠ°ΠΌΠΎ Π½Π΅Π°ΠΊΡΠΈΠ²Π΅Π½).
Zookeeper
Zookeeper ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠΎΠ»ΡΡΠ° Π½Π° Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈ ΠΈ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΎΡ. ΠΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠ°ΠΆΠ΅ Π΄Π°Π»ΠΈ Π±ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅ ΡΠ° ΠΆΠΈΠ²ΠΈ (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΡΠ΅Π· zookeeper-shell Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ls /brokers/ids), ΠΊΠΎΠΉ ΠΎΡ Π±ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅ Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΡΡ (get /controller), Π΄Π°Π»ΠΈ ΠΏΠ°ΡΡΠΈΡΠΈΠΈΡΠ΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΡΡΡ ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ (get /brokers/topics/topic_name/partitions/partition_number/state). Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠΌΠ΅Π½Π½ΠΎ zookeeper ΠΏΡΡΠ²ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΠΏΠΈΡΠ°Π½ ΠΎΡ producer ΠΈ consumer, Π·Π° Π΄Π° ΡΠ·Π½Π°Π΅ Π½Π° ΠΊΠΎΠΉ Π±ΡΠΎΠΊΠ΅Ρ ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ΅ΠΌΠΈ ΠΈ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π°Ρ. Π ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ Π·Π° ΡΠ΅ΠΌΠ° Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ replication factor, ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ ΠΎΡ 1, zookeeper ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈ, ΠΊΠΎΠΈ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ ΡΠ° Π»ΠΈΠ΄Π΅ΡΠΈ (Π² ΡΡΡ
ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π° ΠΈ ΠΎΡ ΡΡΡ
ΡΠ΅ ΡΠ΅ ΡΠ΅ΡΠ΅). ΠΡΠΈ ΠΏΠ°Π΄Π°Π½Π΅ Π½Π° Π±ΡΠΎΠΊΠ΅Ρ, ΡΠΎΡΠ½ΠΎ Π² zookeeper ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΠΏΠΈΡΠ°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π½ΠΎΠ²ΠΈΡΠ΅ Π»ΠΈΠ΄Π΅Ρ-ΠΏΠ°ΡΡΠΈΡΠΈΠΈ (ΠΎΡ Π²Π΅ΡΡΠΈΡ 1.1.0 Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ, ).
Π ΠΏΠΎ-ΡΡΠ°ΡΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° Kafka zookeeper ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡΠ΅ ΠΈ Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΡΡΠ΅ΡΠΈ, Π½ΠΎ ΡΠ΅Π³Π° ΡΠ΅ ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π°Ρ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π½Π° ΡΠ΅ΠΌΠ° __consumer_offsets Π½Π° Π±ΡΠΎΠΊΠ΅ΡΠ° (Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ΅ ΠΎΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ zookeeper Π·Π° ΡΠ΅Π·ΠΈ ΡΠ΅Π»ΠΈ).
ΠΠ°ΠΉ-ΠΏΡΠΎΡΡΠΈΡΡ Π½Π°ΡΠΈΠ½ Π΄Π° ΠΏΡΠ΅Π²ΡΡΠ½Π΅ΡΠ΅ Π²Π°ΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Π² ΡΠΈΠΊΠ²Π° Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π°Π³ΡΠ±Π°ΡΠ° Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ zookeeper. Π ΡΠ°ΠΊΡΠ² ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈ ΠΎΡΠΊΡΠ΄Π΅ Π΄Π° ΡΠ΅ΡΠ΅ΡΠ΅.
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»
Producer β ΡΠΎΠ²Π° Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ Π΅ ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΏΡΡΠΊΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² Apache Kafka. Producer ΠΈΠ·Π±ΠΈΡΠ° ΡΠ΅ΠΌΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠΈΡΠ½ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΈ Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° Π·Π°ΠΏΠΈΡΠ²Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² Π½Π΅Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, producer ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠ»ΡΠ³Π° Π·Π° ΠΎΠ±ΡΠ²Π»Π΅Π½ΠΈΡ. Π ΡΠ°ΠΊΡΠ² ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠΉ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π² ΡΠ΅ΠΌΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΡΠΎΠΏΠΈΠΊΠΈ ΡΡΠ±ΠΈΡΠΈΡ ΠΊΠ°ΡΠΎ βΠΎΠ±ΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΎβ, βΠΎΠ±ΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²Π΅Π½ΠΎβ, βΠΎΠ±ΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ·ΡΡΠΈΡΠΎβ ΠΈ Ρ.Π½. ΠΡΡΠΊΠΎ ΡΡΠ±ΠΈΡΠΈΠ΅ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π΄Π²ΠΎΠΉΠΊΠ° ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ.
ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠ±ΠΈΡΠΈΡ ΡΠ΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΠΏΠΎ ΠΏΠ°ΡΡΠΈΡΠΈΠΈΡΠ΅ Π½Π° ΡΠ΅ΠΌΠ°ΡΠ° Ρ round-robin, Π°ΠΊΠΎ ΠΊΠ»ΡΡΡΡ Π½Π΅ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ (Π·Π°Π³ΡΠ±Π° Π½Π° ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΎΡΡ), ΠΈ ΡΡΠ΅Π· MurmurHash (ΠΊΠ»ΡΡ), Π°ΠΊΠΎ ΠΊΠ»ΡΡΡΡ ΠΏΡΠΈΡΡΡΡΠ²Π° (ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΎΡΡ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄Π½Π° ΠΏΠ°ΡΡΠΈΡΠΈΡ).
Π’ΡΠΊ Π²Π΅Π΄Π½Π°Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈΠΌ, ΡΠ΅ Kafka Π³Π°ΡΠ°Π½ΡΠΈΡΠ° ΡΠ΅Π΄Π° Π½Π° ΡΡΠ±ΠΈΡΠΈΡΡΠ° ΡΠ°ΠΌΠΎ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄Π½Π° ΠΏΠ°ΡΡΠΈΡΠΈΡ. ΠΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΡΠΎΠ²Π° ΡΠ΅ΡΡΠΎ Π½Π΅ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½ΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π° Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ ΠΎΠ±ΡΠ²Π»Π΅Π½ΠΈΠ΅ Π² Π΅Π΄Π½Π° ΠΏΠ°ΡΡΠΈΡΠΈΡ (ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π·Π°ΠΏΠ°Π·Π²Π°ΠΉΠΊΠΈ ΡΠ΅Π΄Π° Π½Π° ΡΠ΅Π·ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΎΠ±ΡΠ²Π»Π΅Π½ΠΈΠ΅ΡΠΎ). ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π΄Π°Π²Π°ΡΠ΅ ΠΏΠΎΡΠ΅Π΄Π΅Π½ Π½ΠΎΠΌΠ΅Ρ Π² Π΅Π΄Π½ΠΎ ΠΎΡ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° Π½Π° ΡΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ.
Consumer

ΠΠΎΠ½ΡΡΠΌΠΈΡΠ°ΡΠΈΡΡ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ Apache Kafka. ΠΠΊΠΎ ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠΎΠ΄Π΅ΡΠ°ΡΠΎΡΠ΅Π½ ΡΡΡΠ²ΠΈΡ. Π’ΠΎΠ·ΠΈ ΡΡΡΠ²ΠΈΡ ΡΠ΅ ΡΠ΅ Π°Π±ΠΎΠ½ΠΈΡΠ° Π·Π° ΡΠ΅ΠΌΠ°ΡΠ° Π½Π° ΡΡΡΠ²ΠΈΡΠ° Π·Π° ΠΎΠ±ΡΠ²ΠΈ ΠΈ ΠΏΡΠΈ ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° Π½ΠΎΠ²Π° ΠΎΠ±ΡΠ²Π° ΡΠ΅ Ρ ΠΏΠΎΠ»ΡΡΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ.
Apache Kafka ΠΏΠΎΠΌΠ½ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈ ΡΡΠ±ΠΈΡΠΈΡ Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΡΡ (Π·Π° ΡΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ»ΡΠΆΠ΅Π±Π½Π°ΡΠ° ΡΠ΅ΠΌΠ° __consumer__offsets), ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΠΏΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°Π½Π΅ ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΡΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π²Π° ΠΏΡΡΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Π°ΠΊΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΠΏΡΠΈΡΡΠ° enable.auto.commit = true ΠΈ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ΅ ΠΎΡΠ΄Π°Π΄Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΏΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΠ° Π² ΡΠ΅ΠΌΠ°ΡΠ° Π½Π° Kafka, ΠΌΠΎΠΆΠ΅ Π΄Π° . Π ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΠ° ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΡΡΡΠ½ΠΎ (ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ²Π° ΠΌΠΎΠΌΠ΅Π½ΡΠ°, Π² ΠΊΠΎΠΉΡΠΎ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈ ΠΊΠΎΠΌΠΈΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ΠΎΡΠΎ ΡΡΠ±ΠΈΡΠΈΠ΅).
Π ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ Π΅Π΄ΠΈΠ½ ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡ Π½Π΅ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΠΏΠΎΡΠΎΠΊΡΡ ΠΎΡ Π½ΠΎΠ²ΠΈ ΡΡΠ±ΠΈΡΠΈΡ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»ΡΠΌ), ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΠ°, ΡΠ²ΡΡΠ·Π²Π°ΠΉΠΊΠΈ Π³ΠΈ Π² ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΡΠΊΠ° Π³ΡΡΠΏΠ°. ΠΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΡΠΊΠ°ΡΠ° Π³ΡΡΠΏΠ° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΡΠ² ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡ, Π½ΠΎ Ρ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π² Π³ΡΡΠΏΠ°ΡΠ°. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΡΠ²ΠΎΡ Π΄ΡΠ» ΠΎΡ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ°, ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΡΠ΅ΡΠ΅Π½Π΅.
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΎΡ ΡΠ΅ΡΡΡΠ²Π°Π½Π΅ΡΠΎ

Π’ΡΠΊ Π½ΡΠΌΠ° Π΄Π° ΠΏΠΈΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ½ΠΈΡΠ΅Π»Π΅Π½ ΡΠ΅ΠΊΡΡ, ΠΏΡΠΎΡΡΠΎ ΡΠ΅ ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ. Π’Π΅ΡΡΠΎΠ²Π΅ΡΠ΅ Π±ΡΡ Π° ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈ Π½Π° 3 ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° (12 CPU, 384 GB RAM, 15k SAS DISK, 10 GBit/s ΠΠ΅Ρ), Π±ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅ ΠΈ zookeeper Π±ΡΡ Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π² lxc.
Π’Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°
Π Ρ ΠΎΠ΄Π° Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ Π±ΡΡ Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ.
- Π‘ΠΊΠΎΡΠΎΡΡ Π½Π° Π·Π°ΠΏΠΈΡ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΡΠ°Π·ΠΌΠ΅Ρ 1 KB Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ 9 ΠΏΡΠΎΠ΄ΡΡΠ΅ΡΠ° β 1,300,000 ΡΡΠ±ΠΈΡΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°.
- Π‘ΠΊΠΎΡΠΎΡΡ Π½Π° ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΡΠ°Π·ΠΌΠ΅Ρ 1 KB Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ 9 ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΎΡΠ° β 1,500,000 ΡΡΠ±ΠΈΡΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°.
Π’Π΅ΡΡ Π½Π° ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡΠ°
Π Ρ ΠΎΠ΄Π° Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ Π±ΡΡ Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ (3 Π±ΡΠΎΠΊΠ΅ΡΠ°, 3 zookeeper).
- ΠΠ΅ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΎΡΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ Π±ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅ Π½Π΅ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡΠΏΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠ°. Π Π°Π±ΠΎΡΠ°ΡΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π² Π½ΠΎΡΠΌΠ°Π»Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ, Π½ΠΎ Π½Π° ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ Π±ΡΠΎΠΊΠ΅ΡΠΈ ΠΏΠ°Π΄Π° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅.
- ΠΠ΅ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π΄Π²Π°ΠΌΠ° Π±ΡΠΎΠΊΠ΅ΡΠΈ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΊΠ»ΡΡΡΠ΅Ρ ΠΎΡ ΡΡΠΈ Π±ΡΠΎΠΊΠ΅ΡΠ° ΠΈ min.isr = 2 Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π·Π° Π·Π°ΠΏΠΈΡ, Π½ΠΎ ΠΎΡΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ min.isr = 1, ΠΊΠ»ΡΡΡΠ΅ΡΡΡ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΊΠ°ΠΊΡΠΎ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅, ΡΠ°ΠΊΠ° ΠΈ Π·Π° Π·Π°ΠΏΠΈΡ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠΎΠ·ΠΈ ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈ Π½Π° ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½Π΅ΡΠΎ Π·Π° Π²ΠΈΡΠΎΠΊΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅.
- ΠΠ΅ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡΠ²ΡΡΠΈΡΠ΅ Π½Π° Zookeeper Π½Π΅ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡΠΏΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°. Π Π°Π±ΠΎΡΠ°ΡΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π² Π½ΠΎΡΠΌΠ°Π»Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ.
- ΠΠ΅ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π΄Π²Π°ΠΌΠ° ΡΡΡΠ²ΡΡΠΈ Π½Π° Zookeeper Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ ΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΠΎΠ½Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡΠ²ΡΡΠΈΡΠ΅ Π½Π° Zookeeper. Π’ΠΎΠ²Π° ΠΈΠ·ΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΅ Π²ΡΡΠ½ΠΎ Π·Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° Π½Π° Zookeeper Ρ 3 ΡΡΡΠ²ΡΡΠ°. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½ΠΈΡΡΠ° Π±Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ ΠΊΠ»ΡΡΡΠ΅ΡΡΡ Π½Π° Zookeeper Π΄ΠΎ 5 ΡΡΡΠ²ΡΡΠ° Π·Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡΠ°.
Kafka ΠΊΠ°ΡΠΎ ΡΡΠ»ΡΠ³Π°

Π£Π±Π΅Π΄ΠΈΡ ΠΌΠ΅ ΡΠ΅, ΡΠ΅ Kafka Π΅ ΠΎΡΠ»ΠΈΡΠ½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠ΅ΡΠ°Π²Π° ΠΏΠΎΡΡΠ°Π²Π΅Π½Π°ΡΠ° ΠΏΡΠ΅Π΄ Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° (ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π±ΡΠΎΠΊΠ΅ΡΠ° Π·Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ). ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° Π·Π°Π±ΡΠ°Π½ΠΈΠΌ Π½Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΡΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΡΠΌ Kafka ΠΈ Ρ Π·Π°ΡΠ²ΠΎΡΠΈΡ ΠΌΠ΅ ΠΎΡΠ³ΠΎΡΠ΅ Ρ ΡΡΠ»ΡΠ³Π°ΡΠ° data-bus. ΠΠ°ΡΠΎ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅? ΠΡΡΡΠ½ΠΎΡΡ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΈΡΠΈΠ½ΠΈ.
Data-bus ΠΏΠΎΠ΅ Π²ΡΠΈΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΡΠ° Ρ Kafka (ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³, ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°Π½Π΅, Π»ΠΎΠ³ΠΈΡΠ°Π½Π΅, ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ ΠΈ Ρ.Π½.). Π’Π°ΠΊΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΡΠ° Ρ Π±ΡΠΎΠΊΠ΅ΡΠ° Π·Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ Π»Π΅ΡΠ½ΠΎ.
Data-bus ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΡΠ΅ Π°Π±ΡΡΡΠ°Ρ ΠΈΡΠ°ΠΌΠ΅ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΡ Π΅Π·ΠΈΠΊ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Kafka.
Data-bus ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ Π΄Π° ΡΠ΅ Π°Π±ΡΡΡΠ°Ρ ΠΈΡΠ°Ρ ΠΎΡ ΡΠ»ΠΎΡ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅. ΠΠΎΠΆΠ΅ Π±ΠΈ Π² Π½ΡΠΊΠ°ΠΊΡΠ² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅ ΡΠΌΠ΅Π½ΠΈΠΌ Kafka Ρ Pulsar, ΠΈ Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½ΠΈΠΊΠΎΠΉ Π½ΡΠΌΠ° Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ (Π²ΡΠΈΡΠΊΠΈ ΡΡΠ»ΡΠ³ΠΈ Π·Π½Π°ΡΡ ΡΠ°ΠΌΠΎ Π·Π° API Π½Π° data-bus).
Data-bus ΠΏΠΎΠ΅ Π²Π°Π»ΠΈΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡ Π΅ΠΌΠΈΡΠ΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡΡΠ°.
Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° data-bus Π±Π΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ.
ΠΠΎΠ΄ ΠΏΡΠΈΠΊΡΠΈΡΠΈΠ΅ Π½Π° data-bus ΠΌΠΎΠΆΠ΅ΠΌ Π±Π΅Π· Π΄Π°ΡΠ½ΡΠ°ΠΉΠΌ, Π½Π΅Π·Π°Π±Π΅Π»ΡΠ·Π°Π½ΠΎ Π΄Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²Π΅ΡΡΠΈΠΈΡΠ΅ Π½Π° Kafka, ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈΡΠ΅, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅, Π±ΡΠΎΠΊΠ΅ΡΠΈΡΠ΅ ΠΈ Ρ.Π½.
Data-bus ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Π»ΠΈΠΏΡΠ²Π°Ρ Π² Kafka (ΠΊΠ°ΡΠΎ ΠΎΠ΄ΠΈΡ Π½Π° ΡΠ΅ΠΌΠΈ, ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈΡΠ΅ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ°, ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° DLQ ΠΈ Ρ.Π½.).
Data-bus ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° failover Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ»ΡΠ³ΠΈ.
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ°, Π·Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°ΡΠ΅ ΡΡΠ±ΠΈΡΠΈΡ Π² Π±ΡΠΎΠΊΠ΅ΡΠ° Π·Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΠΌΠ°Π»ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π² ΠΊΠΎΠ΄Π° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° ΡΠΈ. Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ. ΠΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅, ΡΠ΅ΡΠ΅ΡΠ΅ ΠΈ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°ΡΠ΅ Ρ Π΅Π΄Π½Π° ΡΠ΅Π΄ ΠΊΠΎΠ΄. Π¦ΡΠ»Π°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΅ ΡΠΊΡΠΈΡΠ° ΠΎΡ Π²Π°Ρ, Π½Π°Π²ΡΠ½ ΠΈΠ·Π»ΠΈΠ·Π°Ρ ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΠΊΠΈ, ΡΠΈΠΏ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠΎΠ΄ ΠΊΠ°ΠΏΠ°ΠΊΠ° ΡΡΠ»ΡΠ³Π°ΡΠ° data-bus ΡΡΠ°ΡΡΠΈΡΠ° Π² Kubernetes Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ Π±ΡΠΎΠΉ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΈ ΠΈΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½ΡΠΆΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Π½ΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ Π·Π° Π²Π°ΡΠ°ΡΠ° ΡΡΠ»ΡΠ³Π°.
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΡΠ΅Π±ΡΡΠ½Π° ΠΊΡΡΡΡΠΌΠ°, ΠΈ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈΠΌΠ° ΡΠ²ΠΎΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ.
- Data-bus ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΡ Π²Π°Ρ, Π·Π° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Π²ΡΠ½ΡΠ½ΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
- Data-bus ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° Π±ΡΠΎΡ Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΈ Π±ΡΠΎΠΊΠ΅ΡΠ° Π·Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΡΠΈΡΡΠ° Kafka.
- ΠΠ΅ Π²ΡΠΈΡΠΊΠΎ ΠΌΠΎΠΆΠ΅ ΡΠ°ΠΊΠ° Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠΊΡΠΈΠ΅ ΠΎΡ ΡΡΠ»ΡΠ³ΠΈΡΠ΅, Π½Π΅ Π½ΠΈ ΡΠ΅ ΠΈΡΠΊΠ° Π΄Π° Π΄ΡΠ±Π»ΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° KSQL ΠΈΠ»ΠΈ Kafka Streams Π² data-bus, Π·Π°ΡΠΎΠ²Π° ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ Π½Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ.
Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°ΡΠ° Π½Π°Π΄Π²ΠΈΡ Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈΡΠ΅, ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΡΠΊΡΠΈΠ΅ΠΌ Π±ΡΠΎΠΊΠ΅ΡΠ° Π·Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π°Π΄ ΠΎΡΠ΄Π΅Π»Π½Π° ΡΡΠ»ΡΠ³Π° ΡΠ΅ ΠΎΠΏΡΠ°Π²Π΄Π°. ΠΡΠ΅Π· Π³ΠΎΠ΄ΠΈΠ½Π°ΡΠ° Π½Π° Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠ°ΡΠΈΡ Π½Π΅ ΡΠΌΠ΅ ΠΈΠΌΠ°Π»ΠΈ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΈ ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
P.S. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΠΏΡΠΈΡΡΠ΅Π»ΠΊΠ°ΡΠ° ΠΌΠΈ, ΠΠΊΠ°ΡΠ΅ΡΠΈΠ½Π° ΠΠ±Π°Π»ΡΠ΅Π²Π°, Π·Π° ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΈΡΠ΅ ΠΈΠ»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΊΡΠΌ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ. ΠΠΊΠΎ Π²ΠΈ Ρ Π°ΡΠ΅ΡΠ²Π°Ρ, ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΎΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ»ΡΡΡΡΠ°ΡΠΈΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
