ΠŸΡΡ‚ΡŒ студСнтов ΠΈ Ρ‚Ρ€ΠΈ распрСдСлённых key-value Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°

Или ΠΊΠ°ΠΊ ΠΌΡ‹ писали ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ C++ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для ZooKeeper, etcd ΠΈ Consul KV

Π’ ΠΌΠΈΡ€Π΅ распрСдСлённых систСм сущСствуСт ряд Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡: Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ составС кластСра, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ ΡƒΠ·Π»ΠΎΠ², дСтСкция сбойных ΡƒΠ·Π»ΠΎΠ², Π²Ρ‹Π±ΠΎΡ€ Π»ΠΈΠ΄Π΅Ρ€Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этих Π·Π°Π΄Π°Ρ‡ созданы ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ распрСдСлённыС систСмы β€” сСрвисы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ. БСйчас нас Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΈΠ· Π½ΠΈΡ…: ZooKeeper, etcd ΠΈ Consul. Из всСй Π±ΠΎΠ³Π°Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Consul ΠΌΡ‹ сосрСдоточимся Π½Π° Consul KV.

ΠŸΡΡ‚ΡŒ студСнтов ΠΈ Ρ‚Ρ€ΠΈ распрСдСлённых key-value Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°

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

ИдСя, призванная Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π·Π°Ρ€ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ австралийском консалтинговом агСнтствС, Π° Π½Π°ΠΌ – нСбольшой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ студСнтов – Π²Ρ‹ΠΏΠ°Π»ΠΎ Π΅Ρ‘ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ, ΠΎ Ρ‡Ρ‘ΠΌ я ΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ.

Нам ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ZooKeeper, etcd ΠΈ Consul KV. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° написана Π½Π° C++, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ»Π°Π½Ρ‹ ΠΏΠΎ ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки.

МодСли Π΄Π°Π½Π½Ρ‹Ρ…

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс для Ρ‚Ρ€Ρ‘Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… систСм, Π½Π°Π΄ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρƒ Π½ΠΈΡ… ΠΎΠ±Ρ‰Π΅Π³ΠΎ, ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ.

ZooKeeper

ΠŸΡΡ‚ΡŒ студСнтов ΠΈ Ρ‚Ρ€ΠΈ распрСдСлённых key-value Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°

ΠšΠ»ΡŽΡ‡ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΡƒΠ·Π»Π°ΠΌΠΈ (znodes). БоотвСтствСнно, для ΡƒΠ·Π»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Π΅Π³ΠΎ Π΄Π΅Ρ‚Π΅ΠΉ. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ создания znode (create) ΠΈ измСнСния значСния (setData) Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹: Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. К опСрациям ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сущСствования ΡƒΠ·Π»Π°, чтСния значСния ΠΈ получСния Π΄Π΅Ρ‚Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ watches. Watch β€” это ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ срабатываСт, ΠΊΠΎΠ³Π΄Π° вСрсия ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сСрвСрС измСняСтся. Для обнаруТСния ΠΎΡ‚ΠΊΠ°Π·ΠΎΠ² слуТат эфСмСрныС ΡƒΠ·Π»Ρ‹. Они ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊ сСссии создавшСго ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Когда ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ сСссию ΠΈΠ»ΠΈ пСрСстаёт ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°Ρ‚ΡŒ ZooKeeper ΠΎ своём сущСствовании, эти ΡƒΠ·Π»Ρ‹ автоматичСски ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ простыС Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ – Π½Π°Π±ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»ΠΈΠ±ΠΎ всС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, Π»ΠΈΠ±ΠΎ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, Ссли хотя Π±Ρ‹ для ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

etcd

ΠŸΡΡ‚ΡŒ студСнтов ΠΈ Ρ‚Ρ€ΠΈ распрСдСлённых key-value Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ этой систСмы явно Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»ΡΠ»ΠΈΡΡŒ ZooKeeper’ом, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ сдСлали всё ΠΈΠ½Π°Ρ‡Π΅. Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ здСсь Π½Π΅Ρ‚, Π½ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ лСксикографичСски упорядочСнный Π½Π°Π±ΠΎΡ€. МоТно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρƒ. Вакая структура ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странной, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½Π° ΠΎΡ‡Π΅Π½ΡŒ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Π°, ΠΈ иСрархичСский Π²ΠΈΠ΄ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Ρ‘ Π»Π΅Π³ΠΊΠΎ эмулируСтся.

Π’ etcd Π½Π΅Ρ‚ стандартной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ compare-and-set, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅ β€” Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ Π²ΠΎ всСх Ρ‚Ρ€Ρ‘Ρ… систСмах, Π½ΠΎ Π² etcd Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ особСнно Ρ…ΠΎΡ€ΠΎΡˆΠΈ. Они состоят ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… Π±Π»ΠΎΠΊΠΎΠ²: check, success, failure. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π»ΠΎΠΊ содСрТит Π½Π°Π±ΠΎΡ€ условий, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ – ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Вранзакция выполняСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ. Если всС условия Π²Π΅Ρ€Π½Ρ‹, Ρ‚ΠΎ выполняСтся Π±Π»ΠΎΠΊ success, ΠΈΠ½Π°Ρ‡Π΅ – failure. Π’ вСрсии API 3.3 Π±Π»ΠΎΠΊΠΈ success ΠΈ failure ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ условныС конструкции ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ уровня влоТСнности. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Watches здСсь Ρ‚ΠΎΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, хотя ΠΎΠ½ΠΈ устроСны Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ послС установки watch’а Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ всС обновлСния Π² этом Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚Π΅ watch, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅. Π’ etcd Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ клиСнтских сСссий ZooKeeper ΡΠ²Π»ΡΡŽΡ‚ΡΡ leases.

Consul KV

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

ΠŸΡΡ‚ΡŒ студСнтов ΠΈ Ρ‚Ρ€ΠΈ распрСдСлённых key-value Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°
ВмСсто watch’Сй Π² Consul ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ HTTP запросы. По сути это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° чтСния Π΄Π°Π½Π½Ρ‹Ρ…, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… наряду с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ указываСтся послСдняя извСстная вСрсия Π΄Π°Π½Π½Ρ‹Ρ…. Если тСкущая вСрсия ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сСрвСрС большС ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ, ΠΎΡ‚Π²Π΅Ρ‚ возвращаСтся сразу, ΠΈΠ½Π°Ρ‡Π΅ – ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ измСнится. Π—Π΄Π΅ΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ сСссии, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ ΠΊ ΠΊΠ»ΡŽΡ‡Π°ΠΌ. Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ etcd ΠΈ ZooKeeper, Π³Π΄Π΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ сСссий ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ связанных ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, здСсь Π΅ΡΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сСссия просто ΠΎΡ‚ Π½ΠΈΡ… открСпляСтся. Доступны Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π±Π΅Π· Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠΉ, Π½ΠΎ со всСвозмоТными ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ.

Π‘Π²ΠΎΠ΄ΠΈΠΌ всё Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ

Π‘Π°ΠΌΠΎΠΉ строгой модСлью Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ZooKeeper. Π’Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ запросы Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹, доступныС Π² etcd, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ эффСктивно ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈ Π² ZooKeeper, Π½ΠΈ Π² Consul. ΠŸΡ‹Ρ‚Π°ΡΡΡŒ Π²ΠΎΠ±Ρ€Π°Ρ‚ΡŒ всё Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΎΡ‚ всСх сСрвисов, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ интСрфСйс ΠΏΠΎΡ‡Ρ‚ΠΈ эквивалСнтный интСрфСйсу ZooKeeper со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ сущСствСнными ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ:

  • sequence, container ΠΈ TTL nodes Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ
  • ACL Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ
  • ΠΌΠ΅Ρ‚ΠΎΠ΄ set создаёт ΠΊΠ»ΡŽΡ‡, Ссли ΠΎΠ½ Π½Π΅ сущСствовал (Π² ZK setData Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² этом случаС)
  • ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ set ΠΈ cas Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ (Π² ZK это ΠΏΠΎ сути ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅)
  • ΠΌΠ΅Ρ‚ΠΎΠ΄ erase удаляСт Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ вмСстС с ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ (Π² ZK delete Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли Ρƒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π΅ΡΡ‚ΡŒ Π΄Π΅Ρ‚ΠΈ)
  • для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° вСрсия – вСрсия значСния (Π² ZK ΠΈΡ… Ρ‚Ρ€ΠΈ)

ΠžΡ‚ΠΊΠ°Π· ΠΎΡ‚ sequential ΡƒΠ·Π»ΠΎΠ² связан с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² etcd ΠΈ Consul для Π½ΠΈΡ… Π½Π΅Ρ‚ встроСнной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ, Π° ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ интСрфСйса Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

РСализация Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ ZooKeeper повСдСния ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π° Π±Ρ‹ поддСрТания Π² etcd ΠΈ Consul для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ счётчика Π΄Π΅Ρ‚Π΅ΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΡΡ‚Π°Ρ€Π°Π»ΠΈΡΡŒ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ хранСния ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ всё ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ.

Вонкости Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Рассмотрим ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ аспСкты Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Ρ€Π°Π·Π½Ρ‹Ρ… систСмах.

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ Π² etcd

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ иСрархичСского Π²ΠΈΠ΄Π° Π² etcd оказалось ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых интСрСсных Π·Π°Π΄Π°Ρ‡. Запросы Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список ΠΊΠ»ΡŽΡ‡Π΅ΠΉ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ прСфиксом. НапримСр, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ всё, Ρ‡Ρ‚ΠΎ начинаСтся с "/foo", Π²Ρ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ["/foo", "/fop"). Но это Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΎ Π±Ρ‹ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ всё ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΊΠ»ΡŽΡ‡Π°, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ, Ссли ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ большоС. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ прСобразования ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² zetcd. Он ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°, Ρ€Π°Π²Π½ΠΎΠ³ΠΎ Π³Π»ΡƒΠ±ΠΈΠ½Π΅ ΡƒΠ·Π»Π° Π² Π΄Π΅Ρ€Π΅Π²Π΅. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

"/foo" -> "u01/foo"
"/foo/bar" -> "u02/foo/bar"

Π’ΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всСх нСпосрСдствСнных Π΄Π΅Ρ‚Π΅ΠΉ ΠΊΠ»ΡŽΡ‡Π° "/foo" ΠΌΠΎΠΆΠ½ΠΎ, запросив Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ["u02/foo/", "u02/foo0"). Π”Π°, Π² ASCII "0" стоит сразу послС "/".

Но ΠΊΠ°ΠΊ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹? ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π²ΠΈΠ΄Π° ["uXX/foo/", "uXX/foo0") для XX ΠΎΡ‚ 01 Π΄ΠΎ FF. И Ρ‚ΡƒΡ‚ ΠΌΡ‹ ΡƒΠΏΡ‘Ρ€Π»ΠΈΡΡŒ Π² Π»ΠΈΠΌΠΈΡ‚ числа ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π±Ρ‹Π»Π° ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Π° простая систСма прСобразования ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° эффСктивно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π°, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка Π΄Π΅Ρ‚Π΅ΠΉ. Достаточно Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ спСцсимвол ΠΏΠ΅Ρ€Π΅Π΄ послСдним Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ. НапримСр:

"/very" -> "/u00very"
"/very/long" -> "/very/u00long"
"/very/long/path" -> "/very/long/u00path"

Π’ΠΎΠ³Π΄Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° "/very" прСвращаСтся Π² ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ "/u00very" ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ["/very/", "/very0"), Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ всСх Π΄Π΅Ρ‚Π΅ΠΉ – Π² запрос ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ["/very/u00", "/very/u01").

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π² ZooKeeper

Как я ΡƒΠΆΠ΅ упомянул, Π² ZooKeeper нСльзя ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΡƒΠ·Π΅Π», Ссли Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π΅Ρ‚ΠΈ. ΠœΡ‹ ΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ вмСстС с ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ. Как Π±Ρ‹Ρ‚ΡŒ? ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ это оптимистично. Π‘Π½Π°Ρ‡Π°Π»Π° рСкурсивно ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ, получая Π΄Π΅Ρ‚Π΅ΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ запросом. Π—Π°Ρ‚Π΅ΠΌ строим Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, которая пытаСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС ΡƒΠ·Π»Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС. РазумССтся, ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ Π² Π½Ρ‘ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ измСнСния. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС транзакция провалится. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π΅Ρ‰Ρ‘ Π² процСссС чтСния. Запрос Π΄Π΅Ρ‚Π΅ΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, эта Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° ΡƒΠ΄Π°Π»Π΅Π½Π°. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях ΠΌΡ‹ повторяСм вСсь процСсс Π·Π°Π½ΠΎΠ²ΠΎ.

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΄Π΅Π»Π°Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° вСсьма нСэффСктивным, Ссли Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π΅Ρ‚ΠΈ ΠΈ Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ, удаляя ΠΈ создавая ΠΊΠ»ΡŽΡ‡ΠΈ. Однако, это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π½Π΅ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² etcd ΠΈ Consul.

set Π² ZooKeeper

Π’ ZooKeeper ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ со структурой Π΄Π΅Ρ€Π΅Π²Π° (create, delete, getChildren) ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΡƒΠ·Π»Π°Ρ… (setData, getData).ΠŸΡ€ΠΈ этом всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ строгиС прСдусловия: create Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли ΡƒΠ·Π΅Π» ΡƒΠΆΠ΅ создан, delete ΠΈΠ»ΠΈ setData – Ссли Π΅Π³ΠΎ Π΅Ρ‰Ρ‘ Π½Π΅ сущСствуСт. Нам ΠΆΠ΅ Π±Ρ‹Π» Π½ΡƒΠΆΠ΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ set, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π°.

Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² – ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ оптимистичный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, сущСствуСт Π»ΠΈ ΡƒΠ·Π΅Π». Если сущСствуСт, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ setData, ΠΈΠ½Π°Ρ‡Π΅ – create. Если послСдний ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π΅Ρ€Π½ΡƒΠ» ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ всё сначала. ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ стоит Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, – это Π±Π΅ΡΡΠΌΡ‹ΡΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° сущСствованиС. МоТно сразу Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ create. УспСшноС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠ·Π»Π° Π½Π΅ сущСствовало ΠΈ ΠΎΠ½ Π±Ρ‹Π» создан. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС create Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, послС Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ setData. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π° ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ, ΠΈ setData Ρ‚ΠΎΠΆΠ΅ Π²Π΅Ρ€Π½Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ всё Π·Π°Π½ΠΎΠ²ΠΎ, Π½ΠΎ стоит Π»ΠΈ?

Если ΠΎΠ±Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π»ΠΎ мСсто ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ это ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ послС Π²Ρ‹Π·ΠΎΠ²Π° set. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠΎΠ΅ Π±Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΡ‹ Π½Π΅ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, ΠΎΠ½ΠΎ ΡƒΠΆΠ΅ стёрто. Π—Π½Π°Ρ‡ΠΈΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ set выполнился ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Ссли Π½Π° самом Π΄Π΅Π»Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ.

Π‘ΠΎΠ»Π΅Π΅ тСхничСскиС тонкости

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ отвлСчёмся ΠΎΡ‚ распрСдСлённых систСм ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎ ΠΊΠΎΠ΄ΠΈΠ½Π³.
Одним ΠΈΠ· основных Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ° Π±Ρ‹Π»Π° ΠΊΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ: Π² Linux, MacOS ΠΈ Windows Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· сСрвисов. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΌΡ‹ Π²Π΅Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ Linux, Π° Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… систСмах Π½Π°Ρ‡Π°Π»ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅. Π­Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π»ΠΎ массу ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя Π±Ρ‹Π»ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ нСпонятно ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒΡΡ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ сСйчас Π² Linux ΠΈ MacOS ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС Ρ‚Ρ€ΠΈ сСрвиса ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ, Π° Π² Windows – Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Consul KV.

Π‘ самого Π½Π°Ρ‡Π°Π»Π° для доступа ΠΊ сСрвисам ΠΌΡ‹ ΡΡ‚Π°Ρ€Π°Π»ΠΈΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ случаС с ZooKeeper Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ°Π» Π½Π° ZooKeeper C++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΠΈΡ‚ΠΎΠ³Π΅ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Windows. Π­Ρ‚ΠΎ, Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° позиционируСтся ΠΊΠ°ΠΊ linux-only. Для Consul СдинствСнным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ оказался ppconsul. Π’ Π½Π΅Π³ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ сСссий ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ. Для etcd ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, Ρ‚Π°ΠΊ ΠΈ Π½Π΅ нашлось, поэтому ΠΌΡ‹ просто сгСнСрировали grpc ΠΊΠ»ΠΈΠ΅Π½Ρ‚.

Π’Π΄ΠΎΡ…Π½ΠΎΠ²ΠΈΠ²ΡˆΠΈΡΡŒ асинхронным интСрфСйсом Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ZooKeeper C++, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ‚ΠΎΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ асинхронный интСрфСйс. Π’ ZooKeeper C++ для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ future/promise. Π’ STL ΠΎΠ½ΠΈ, ΠΊ соТалСнию, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ вСсьма скромно. НапримСр, Π½Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° then, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ примСняСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ future, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ становится доступСн. Π’ нашСм случаС Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для прСобразования Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ нашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой простой ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ° ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ тяТёлыС сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Boost.

Наша рСализация then Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ создаётся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠ°Ρ€Π° promise/future. Новый future возвращаСтся, Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ помСщаСтся вмСстС с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ promise Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. ΠŸΠΎΡ‚ΠΎΠΊ ΠΈΠ· ΠΏΡƒΠ»Π° Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ нСсколько futures ΠΈ ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΈΡ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ wait_for. Когда Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ становится доступным, вызываСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ функция, ΠΈ Π΅Ρ‘ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСдаётся Π² promise.

Π­Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΡ‹ использовали для выполнСния запросов ΠΊ etcd ΠΈ Consul. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСсколько Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ppconsul Π½Π΅ являСтся потокобСзопасным, поэтому обращСния ΠΊ Π½Π΅ΠΌΡƒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ.
Π‘ grpc ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½ΠΎ Π΅ΡΡ‚ΡŒ тонкости. Π’ etcd watches Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· grpc streams. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ для сообщСний ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° создаёт СдинствСнный stream для всСх watches ΠΈ СдинствСнный ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ сообщСния. Π’Π°ΠΊ Π²ΠΎΡ‚ grpc Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ записи Π² stream. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ watch’а Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ запроса, ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для синхронизации условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π˜Ρ‚ΠΎΠ³

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ сами: liboffkv.

Наша ΠΊΠΎΠΌΠ°Π½Π΄Π°: Π Π°Π΅Π΄ Π ΠΎΠΌΠ°Π½ΠΎΠ², Иван Π“Π»ΡƒΡˆΠ΅Π½ΠΊΠΎΠ², Π”ΠΌΠΈΡ‚Ρ€ΠΈΠΉ Камальдинов, Π’ΠΈΠΊΡ‚ΠΎΡ€ ΠšΡ€Π°ΠΏΠΈΠ²Π΅Π½ΡΠΊΠΈΠΉ, Π’ΠΈΡ‚Π°Π»ΠΈΠΉ Иванин.

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