Cloister โ†’ เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบเบธเปˆเบก OTP เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบ

เป€เบเบทเบญเบšเบ—เบธเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบธเบฅเบฐเบเบดเบ”เบ—เบตเปˆเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบšเปเปˆเป„เบงเบซเบผเบทเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบˆเบฐเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเป„เบฅเบเบฐเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ•เบฒเบกเปเบ™เบงเบ™เบญเบ™. เปƒเบ™เบซเบผเบฒเบเป†เบเปเบฅเบฐเบ™เบต, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบซเบกเปˆเปเบฅเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เป‚เบซเบผเบ”เบชเบฐเป€เบฅเปˆเบ. เปเบ•เปˆเบเปเปˆเบเบฑเบ‡เบกเบตเบเปเบฅเบฐเบ™เบตเป€เบฅเบฑเบเบ™เป‰เบญเบเบ—เบตเปˆเบ™เป‰เบญเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒ nodes เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบฎเบนเป‰เบเปˆเบฝเบงเบเบฑเบšเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เปเบฅเบฐเบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เบเบฒเบ™เปเบˆเบเบขเบฒเบเบงเบฝเบเบ‡เบฒเบ™.

Cloister โ†’ เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบเบธเปˆเบก OTP เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบ

เบกเบฑเบ™โ€‹เป„เบ”เป‰โ€‹เบซเบฑเบ™โ€‹เบญเบญเบโ€‹เป‚เบŠเบโ€‹เบ”เบตโ€‹เบ™เบฑเป‰เบ™โ€‹ erlang, เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบš syntax เบ—เบตเปˆเบซเบ™เป‰เบฒเบžเปเปƒเบˆเปเบฅเบฐ hype เบ›เบฐเบกเบฒเบ™เบกเบฑเบ™, เบกเบตเบŠเบฑเป‰เบ™เบ—เปเบฒเบญเบดเบ” เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบฅเบฐเบšเบปเบšเบเบฒเบ™เปเบˆเบเบขเบฒเบ. เปƒเบ™เบ—เบฒเบ‡เบ—เบดเบ”เบชเบฐเบ”เบต, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ:

เบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบ‚เปเป‰เบ„เบงเบฒเบกเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบ™เบ‚เปเป‰เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเบ•เบดเบ”เบ•เบฒเบกเบเบงเบ”เบเบฒ, เปเบกเปˆเบ™เป‚เบ›เปˆเบ‡เปƒเบช [โ€ฆ]

เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ. เปเบˆเบเบขเบฒเบ erlang เป„เบ”เป‰เบ–เบทเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบกเบทเปˆเบญ "เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต" เบซเบกเบฒเบเป€เบ–เบดเบ‡เบเปˆเบญเบ‡เป€เบซเบฅเปเบเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡, เปเบฅเบฐ "docker" เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบ„เปเบฒเบชเบฑเบšเบ„เป‰เบฒเบเบ„เบทเบชเปเบฒเบฅเบฑเบš longshoreman. IN IP4 เบกเบตเบซเบผเบฒเบเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบšเปเปˆเบกเบตเบšเปˆเบญเบ™เบขเบนเปˆ, เบเบฒเบ™เปเบ•เบเปเบเบเบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเปเบกเปˆเบ™เป€เบเบตเบ”เบกเบฒเบˆเบฒเบเบซเบ™เบน chewing เบœเปˆเบฒเบ™เบชเบฒเบเป€เบ„เป€เบšเบตเบ™, เปเบฅเบฐเป€เบงเบฅเบฒเบชเบฐเป€เบฅเปˆเบเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบเบฒเบ™เบœเบฐเบฅเบดเบ”เป„เบ”เป‰เบ–เบทเบเบงเบฑเบ”เปเบ—เบเปƒเบ™เบ—เบปเบ”เบชเบฐเบงเบฑเบ”.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™ incredibly เบ•เบปเบ™เป€เบญเบ‡เบžเบฝเบ‡เบžเป, เบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆ, เปเบฅเบฐเปเบฅเปˆเบ™เปเบˆเบเบขเบฒเบ erlang เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆ IP เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ–เบทเบเบกเบญเบšเปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบธเปˆเบกเบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆ, เปเบฅเบฐเบ‚เปเป‰เบชเบฒเบกเบฒเบ”เบ›เบฒเบเบปเบ”เปเบฅเบฐเบซเบฒเบเป„เบ›เปƒเบ™เบ„เบงเบฒเบกเบเบฐเบ•เบทเบฅเบทเบฅเบปเป‰เบ™เบ‚เบญเบ‡ heel เบŠเป‰เบฒเบเบ‚เบญเบ‡เบœเบนเป‰เบˆเบฑเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™ piles เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ” boilerplate เปƒเบ™เบ—เบธเบเป‚เบ„เบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปเบˆเบเบขเบฒเบ erlang, เป€เบžเบทเปˆเบญเบ•เป‰เบฒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก hostile, เบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™.

ะŸั€ะธะผะตั‡ะฐะฝะธะต: เบ‚เป‰เบญเบเบฎเบนเป‰เบงเปˆเบฒเบกเบต libcluster. เบกเบฑเบ™เป€เบขเบฑเบ™เปเบ—เป‰เป†, เบกเบฑเบ™เบกเบตเบซเบผเบฒเบเบเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เบžเบฑเบ™เบ”เบฒเบง, เบœเบนเป‰เบ‚เบฝเบ™เปเบกเปˆเบ™เบกเบตเบŠเบทเปˆเบชเบฝเบ‡เปƒเบ™เบŠเบธเบกเบŠเบปเบ™, เปเบฅเบฐเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบฑเป‰เบ™. เบ–เป‰เบฒเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบชเบฐเป€เบซเบ™เบตเป‚เบ”เบเบŠเบธเบ”เบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบฅเบฐเบฎเบฑเบเบชเบฒเบเบธเปˆเบกเปเบกเปˆเบ™เบžเบฝเบ‡เบžเปเบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™, เบ‚เป‰เบญเบเบเบดเบ™เบ”เบตเบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™. เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบผเบฒเบ. เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบšเบšเบฅเบฐเบญเบฝเบ” เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบœเบนเป‰เบŠเบปเบกเบžเบฒเบเบ™เบญเบเปƒเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบฅเบฐเบ„เบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบเบธเปˆเบกเบ„เบทเบ™เปƒเปเปˆ.

เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™

เบชเบดเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบชเปˆเบงเบ™โ€‹เบšเบธเบโ€‹เบ„เบปเบ™โ€‹เปเบกเปˆเบ™โ€‹เบซเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบธเบ”โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบฎเบฑเบšโ€‹เป€เบญเบปเบฒโ€‹เบเบฒเบ™โ€‹เบ„เบธเป‰เบกโ€‹เบ„เบญเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบเบธเปˆเบกโ€‹เปเบฅเบฐโ€‹เบˆเบฐโ€‹เบกเบตโ€‹เบ„เบธเบ™โ€‹เบชเบปเบกโ€‹เบšเบฑเบ”โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

  • เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเป‚เบ›เปˆเบ‡เปƒเบชเบเบฑเบšเบ—เบฑเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป‚เบซเบ™เบ”เบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เบเบฒเบเปเบฅเบฐเบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ erlang;
  • callback เบ—เบตเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบ—เบธเบเป†เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ topology (node โ€‹โ€‹เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, node เบ—เบตเปˆเบ™เบตเป‰, เบ„เบงเบฒเบกเบšเปเปˆเบชเบฐเบ–เบฝเบ™เบฅเบฐเบžเบฒเบšเบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™);
  • เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเป‚เบ›เปˆเบ‡เปƒเบชเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบเบธเปˆเบกเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบเบฒเบงเปเบฅเบฐเบชเบฑเป‰เบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบš :nonode@nohost;
  • เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ Docker เบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡, เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™.

เบชเบธเบ”เบ—เป‰เบฒเบเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบ‚เป‰เบญเบเป„เบ”เป‰เบ—เบปเบ”เบชเบญเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบขเบนเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™ :nonode@nohost, เบซเบผเบทเบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเปเบˆเบเบขเบฒเบเบ›เบญเบกเป‚เบ”เบเปƒเบŠเป‰ test_cluster_task, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ docker-compose up --scale my_app=3 เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฒเบกเบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ™ docker เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบฅเบฐเบซเบฑเบ”เปƒเบ”เป†. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบ‚เบถเป‰เบ™เบเบฑเบšเป€เบŠเบฑเปˆเบ™ mnesia - เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆ topology เป„เบ”เป‰โ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹, เบขเบนเปˆโ€‹เป€เบšเบทเป‰เบญเบ‡โ€‹เบซเบฅเบฑเบ‡ scenes เบžเบงเบโ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบเปเปˆโ€‹เบชเป‰เบฒเบ‡โ€‹เบเบธเปˆเบกโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบŠเบตโ€‹เบงเบดเบ”โ€‹เป‚เบ”เบโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เป€เบ•เบฐโ€‹เบšเบฒเบ™โ€‹เป€เบžเบตเปˆเบกโ€‹เป€เบ•เบตเบกโ€‹เบˆเบฒเบโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹.

เบ•เบนเป‰เป€เบชเบทเป‰เบญเบœเป‰เบฒ เบšเปเปˆเป„เบ”เป‰เบ•เบฑเป‰เบ‡เปƒเบˆเปƒเบซเป‰เป€เบ›เบฑเบ™เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบ—เบธเบเบขเปˆเบฒเบ‡เบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบชเบฐเปœเบฑเบšเบชเบฐเปœเบนเบ™เบเบธเปˆเบกเป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบเบฒเป€เบŸ. เบกเบฑเบ™โ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบฅเบนเบโ€‹เบ›เบทเบ™โ€‹เป€เบ‡เบดเบ™โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบˆเบธเบ”โ€‹เบ›เบฐโ€‹เบชเบปเบ‡โ€‹เป€เบžเบทเปˆเบญโ€‹เบเบงเบกโ€‹เป€เบญเบปเบฒโ€‹เบ—เบธเบโ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ—เบตเปˆโ€‹เป€เบ›เบฑเบ™โ€‹เป„เบ›โ€‹เป„เบ”เป‰โ€‹, เบซเบผเบทโ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบ—เบตเปˆโ€‹เบชเบปเบกโ€‹เบšเบนเบ™โ€‹เบ—เบฒเบ‡โ€‹เบ”เป‰เบฒเบ™โ€‹เบงเบดโ€‹เบŠเบฒโ€‹เบเบฒเบ™โ€‹เปƒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบซเบกเบฒเบโ€‹เบงเปˆเบฒโ€‹เบ™เบฑเบโ€‹เบ—เบดเบ”โ€‹เบชเบฐโ€‹เบ”เบตโ€‹เบˆเบฒเบโ€‹. CS เปƒเบชเปˆเปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ™เบตเป‰. เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบ™เบตเป‰เบ–เบทเบเบญเบญเบเปเบšเบšเป€เบžเบทเปˆเบญเบฎเบฑเบšเปƒเบŠเป‰เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบซเบผเบฒเบ, เปเบ•เปˆเป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบšเปเปˆเปƒเบซเบเปˆเป€เบเบตเบ™เป„เบ›เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™. เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเป‚เบ›เปˆเบ‡เปƒเบชเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เปเบฅเบฐเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก elastic เปเบˆเบเบขเบฒเบเบ—เบตเปˆเป€เบ•เบฑเบกเป„เบ›เบ”เป‰เบงเบเบ–เบฑเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบชเบฑเบ”เบ•เบน.

เบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบทเบญเบ

เบ•เบนเป‰เป€เบชเบทเป‰เบญเบœเป‰เบฒ เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ›เบฑเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบœเบนเป‰เปƒเบŠเป‰เบ‚เบฑเป‰เบ™เบชเบนเบ‡เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบฒเบ™เบ›เบฐเบเบญเบšเปเบฅเบฐเบเบฒเบ™เบšเปเบฒเบฅเบธเบ‡เบฎเบฑเบเบชเบฒ cluster เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เป‚เบ”เบเบเบฒเบ™เปเบฅเปˆเบ™เป‚เบ”เบเบเบปเบ‡. Cloister.Manager เปƒเบ™เบ•เบปเป‰เบ™เป„เบกเป‰เบœเบนเป‰เบ„เบธเบกเบ‡เบฒเบ™เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ.

เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ›เบฑเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ, เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป„เบ”เป‰เบญเบตเบ‡เปƒเบชเปˆ config, เบˆเบฒเบเบ—เบตเปˆเบกเบฑเบ™เบญเปˆเบฒเบ™เบ„เปˆเบฒเบžเบทเป‰เบ™เบ–เบฒเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

config :cloister,
  otp_app: :my_app,
  sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
  consensus: 3,              # number of nodes to consider
                             #    the cluster is up
  listener: MyApp.Listener   # listener to be called when
                             #    the ring has changed

เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เบซเบกเบฒเบเป€เบ–เบดเบ‡เบ•เบปเบงเบซเบ™เบฑเบ‡เบชเบทเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: เบ•เบนเป‰เป€เบชเบทเป‰เบญเบœเป‰เบฒ เปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ OTP :my_app, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ erlang เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ nodes, เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบชเบฒเบก, เปเบฅเบฐ MyApp.Listener เป‚เบกเบ”เบนเบ™ (เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ” @behaviour Cloister.Listener) เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบทเปˆเบญเบฎเบฑเบšเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบฒเบ‡เบ”เป‰เบฒเบ™ topology. เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ„เบปเบšเบ–เป‰เบงเบ™เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™.

เบ”เป‰เบงเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ™เบตเป‰, เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ เบ•เบนเป‰เป€เบชเบทเป‰เบญเบœเป‰เบฒ เบˆเบฐ เป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™, เบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ•เบปเป‰เบ™เบ•เปเบˆเบปเบ™เบเปˆเบงเบฒเบเบฒเบ™เบ•เบปเบเบฅเบปเบ‡เป€เบซเบฑเบ™เบ”เบต (เบชเบฒเบก nodes เปเบกเปˆเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.) เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ•เบปเป‰เบ™เบ•เปเบกเบตเป‚เบญเบเบฒเบ”เบ—เบตเปˆเบˆเบฐเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเป€เบกเบทเปˆเบญเบกเบฑเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบเบธเปˆเบกเปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปเบฅเป‰เบง. เป€เบกเบทเปˆเบญเปƒเบ”เบเปเปˆเบ•เบฒเบก topology เบ›เปˆเบฝเบ™เปเบ›เบ‡ (เบกเบฑเบ™เบˆเบฐเบกเบตเบซเบผเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒ nodes เบšเปเปˆเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ synchronously เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™), handler เบˆเบฐเบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ. MyApp.Listener.on_state_change/2. เป€เบงเบฅเบฒเบชเปˆเบงเบ™เปƒเบซเบเปˆเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบš %Cloister.Monitor{status: :up}, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ: "เบชเบฐเบšเบฒเบเบ”เบต, เบเบธเปˆเบกเป„เบ”เป‰เบ–เบทเบเบฅเบงเบšเบฅเบงเบก."

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”, เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ consensus: 3 เปเบกเปˆเบ™เบ”เบตเบ—เบตเปˆเบชเบธเบ”เป€เบžเบฒเบฐเบงเปˆเบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเบกเบต nodes เบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, callback เบˆเบฐเบœเปˆเบฒเบ™ status: :rehashing โ†’ status: :up เบขเบนเปˆเปƒเบ™ node เบ—เบตเปˆเป€เบžเบตเปˆเบกเปƒเบซเบกเปˆเบซเบผเบทเป€เบญเบปเบฒเบญเบญเบ.

เป€เบกเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ” consensus: 1 ะธ เบ•เบนเป‰เป€เบชเบทเป‰เบญเบœเป‰เบฒ เบกเบตเบ„เบงเบฒเบกเบชเบธเบเบˆเบฐเบ‚เป‰เบฒเบกเบเบฒเบ™เบฅเปเบ–เป‰เบฒเบเบฒเบ™เบŠเบธเบกเบ™เบธเบกเบเบธเปˆเบกเป€เบกเบทเปˆเบญเบฅเบฒเบงเป€เบซเบฑเบ™ :nonode@nohost, เบซเบผเบท :node@host, เบซเบผเบท :[email protected] - เบ‚เบถเป‰เบ™โ€‹เบเบฑเบšโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒ node (:none | :shortnames | :longnames).

เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเปเบˆเบเบขเบฒเบ

เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเปเบˆเบเบขเบฒเบเบšเปเปˆเบขเบนเปˆเปƒเบ™เบชเบนเบ™เบเบฒเบเบฒเบ”เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบง เบฅเบงเบกเบกเบตเบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ—เบตเปˆเปเบˆเบเบขเบฒเบ เป€เบŠเบฑเปˆเบ™: mnesia. เบกเบฑเบ™เบ‡เปˆเบฒเบเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒเบ—เบตเปˆเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ„เบทเบ™เปƒเบซเบกเปˆเบˆเบฒเบเบเบฒเบ™เป€เบญเบตเป‰เบ™เบ„เบทเบ™เบ”เบฝเบงเบเบฑเบ™ on_state_change/2. เบ—เบตเปˆเบ™เบตเป‰, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบ›เบฑเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™ reconfigure mnesia เบชเบธเบ”เบšเบดเบ™เปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™ เบ•เบนเป‰เป€เบชเบทเป‰เบญเบœเป‰เบฒ.

เบ›เบฐเป‚เบซเบเบ”เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ เบ•เบนเป‰เป€เบชเบทเป‰เบญเบœเป‰เบฒ เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡ cluster เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ topology เบžเบฒเบเปƒเบ•เป‰ Hood เป„เบ”เป‰. เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเปเบˆเบเบขเบฒเบเบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเปเบฅเป‰เบง, เป‚เบ”เบเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”, เบšเปเปˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบฎเบนเป‰เบ—เบตเปˆเบขเบนเปˆ IP เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบŠเบทเปˆเบ‚เบญเบ‡ node เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒ, เบซเบผเบทเบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบ / เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เบ™เบตเป‰เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ docker เบžเบดเป€เบชเบ”เบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เปเบฅเบฐเบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ‚เบญเบ‡เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เปเบฅเปˆเบ™เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเปเบˆเบเบขเบฒเบเบซเบผเบทเปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™. :nonode@nohost. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™.

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ topology เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบšเบšเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡ MyApp.Listener, เบญเบฒเบ”เบˆเบฐเบชเบฐเป€เบซเบกเบตเบกเบตเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเปเบ‚เบšเบ—เบตเปˆเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบฅเบฐเบ„เบงเบฒเบกเบฅเปเบฒเบญเบฝเบ‡เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบžเบดเบชเบนเบ”เบงเปˆเบฒเป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เบกเบฑเบ™เบšเปเปˆเป€เบ›เบฑเบ™เบซเบเบฑเบ‡, เบžเบฝเบ‡เปเบ•เปˆเป€เบญเบปเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡ libcluster, เบŠเบถเปˆเบ‡เป€เบ›เบฑเบ™เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ—เบปเปˆเบงเป„เบ›เบซเบผเบฒเบ, เบซเบผเบทเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบˆเบฑเบ”เบเบฒเบ™เบเบธเปˆเบกเบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡. เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบงเบกเป€เบญเบปเบฒเบ—เบธเบเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เปเบ•เปˆเปƒเบŠเป‰เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเบชเบธเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเป€เบˆเบฑเบšเบ›เบงเบ”เบ—เบตเปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปเบฅเบฐเบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเบ—เบตเปˆเบซเบเบธเป‰เบ‡เบเบฒเบ.

เบซเบกเบฒเบเป€เบซเบ”: เปƒเบ™เบˆเบธเบ”เบ™เบตเป‰เปƒเบ™เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบกเบตเบ„เปเบฒเบงเปˆเบฒ "Happy clustering!", เปเบฅเบฐ Yandex, เป€เบŠเบดเปˆเบ‡เบ‚เป‰เบญเบเปเบ› (เบ‚เป‰เบญเบเบšเปเปˆเบ•เป‰เบญเบ‡เบœเปˆเบฒเบ™เบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบกเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡), เป„เบ”เป‰เบชเบฐเป€เบซเบ™เบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบซเป‰เบ‚เป‰เบญเบเบงเปˆเบฒ "Happy clustering!" เบšเบฒเบ‡เบ—เบตเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบเบฒเบ™เปเบ›เบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒ, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบฒเบ‡เบžเบนเบกเบชเบฒเบ”เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™