Рэактыўнае праграмаваньне
Курс на Coursera ад Мартина Одерски
Усяго некалькі гадоў назад вялікія праграмы працавалі на дзесятку сэрвэраў, мелі водгук ў некалькі сэкундаў, падтрымку ў некалькі гадзінаў і гігабайты даных. Сёньняшнія праграмы дэплояцца на ўсё, што заўгодна, пачынаючы ад мабільных прыладаў, да воблачных кластэраў, якія працуюць на тысячах шмат-ядровых працэсараў. Колькасьць даных вымяраецца ў пэтабайтах (1015 байт, альбо 1024 тэрабайт). Адпаведна, учорашнія падыходы да распрацоўкі проста не адпавядаюць сёньняшнім патрабаваньням.
Узгоднены, пасьлядоўны падыход павінен ужывацца з наступнымі складальнікамі.
Responsive
Хуткі водгук праграмы – краевугольны камень прыязных адносінаў да карыстальнікаў. Стабільна хуткі водгук вызначае высокую якасьць сэрвісу, спрашчае апрацоўку памылак, падвышае задавальненьне карыстальнікаў і спрыяе далейшым ітэрацыям.
Resilient
Устойлівасьць да адмовы – здольнасьць праграмы заставацца responsive пры сутыкненьні з памылковай сытуацыяй. Кліент праграмы не павінен абцяжарвацца праблемай апрацоўкі яе памылак.
Elastic
Праграма павінна быць элястычнай – здольнасьць праграмы заставацца responsive нават пры павялічаных нагрузках. Рэактыўная праграма павінна вызваляць рэсурсы пры паніжэньні нагрузкі і наадварот запытваць дадатковыя рэсурсы пры павялічэньні нагрузкі.
Message Driven
Праграма павінна засноўвацца на асынхронным (non blocking) абмене паведамленьняў (падзеяў). Гэта дазваляе ўсталёўваць межы паміж кампанэнтамі, зьмяншаць узаемазалежнасьці і павялічваць ізаляцыю кампанэнтаў аднаго ад іншага. Пры такім падыходзе памылкі таксама перадаюцца паміж кампанэнтамі ў якасьці паведамленьняў (падзеяў).
Распрацоўка API
Мікрасэрвісы
Apollo is a set of Java libraries that we use at Spotify when writing microservices.
Building and Running Microservices on OpenShift
https://smartbear.com/learn/api-design/what-are-microservices/
http://lonelycode.com/2014/04/08/microservices-the-blind-leading-the-blind/
https://www.thoughtworks.com/insights/blog/scaling-microservices-event-stream
https://www.nginx.com/blog/introduction-to-microservices/
Лякальная кніга Building microservices
Курс Адама Біна
Архітэктура
Калі коратка, то мікрасэрвісны архітэктурны стыль – гэта падыход у распрацоўцы праграмы, як сукупнасьці невялікіх сэрвісаў, кожны зь якіх працуе ў межах свайго працэсу (напр. Docker), якія асынхронна камунікуюць паміж сабою пры дапамозе легкаважнага мэханізму, як WebSockets альбо HTTP resource API, пры гэтым мовай камунікацыі зьяўляецца JSON. Кожны з сэрвісаў распрацоўваецца вакол вырашэньня вузкай бізнэс задачы. Яны цалкам аўтаматычна і незалежна адзін ад іншага разгортваюцца ў працоўным асяродку.
Адрозьненьне ад бібліятэк
Мікрасэрвісы, як і бібліятэкі (library), зьяўляюцца састаўнымі часткамі праграмы/сыстэмы, іншымі словамі – яе кампанэнтамі. Калі бібліятэкі зьяўляюцца неад'емнай часткай праграмы і зьвяртаньне да іх адбываецца праз in-memory функцыянальныя выклікі, то мікрасэрвісы гэта кампанэнты, якія працуюць за межамі сыстэмнага працэсу (строга кажучы кожны ў сваім асобным працэсе), і камунікацыя зь імі і паміж імі адбываецца пры дапамозе HTTP запытаў, альбо аддаленых працэдурных выклікаў (RPC).
Перавагі і недахопы
Перавагі мікрасэрвісаў:
- Строгія межы модуляў: мікрасэрвісы будуюцца па модульным прынцыпе, што асабліва важна для вялікіх камандаў (праграмаў).
- Незалежнае разгортваньне: простыя і невялікія сэрвісы прасьцей разгортваць у працоўным асяродку, а раз яны незалежныя адзін ад іншага, збой/памылка ў адным сэрвісе ня можа «пакласьці» ўсю сыстэму/праграму.
- Разнастайнасьць тэхналёгій: раз мікрасэрвісы незалежныя, ніякіх праблем ці складанасьцяў інтэграцыі ня выклікае выкарыстаньне розных моваў праграмаваньня, розных фрэймворкаў альбо тэхналёгіяў захоўваньня даных.
Недахопы мікрасэрвісаў:
- Разьмеркаванасьць: гэта зьяўляецца як перавагай (такая праграма ці інфраструктура больш гнуткая і скаліруемая) гэтак і недахопам – разьмеркаваныя сыстэмы складаней распрацоўваць, адлеглыя выклікі марудныя і заўсёды маюць рызыку няўдачы/памылкі.
- Выпадковая альбо няпэўная/магчымая суцэльнасьць (consistency): падтрымліваць строгую суцэльнасьць разьмеркаваных сыстэмаў вельмі складана, таму ўсе вымушаныя мець справу з выпадковай/няпэўнай суцэльнасьцю.
- Апэрацыйная складанасьць: каманда DevOps павінна быць вопытнай і прафэсійнай, каб кіраваць вялікай колькасьцю сэрвісаў, якія рэгулярна разгортваюцца.
Related Patterns
Існуе шэраг іншых патэрнаў дызайну, якія непасрэдна злучаныя з патэрнам мікрасэрвісаў:
- маналітная архітэктура – архітэктура ў процівагу мікрасэрвісам;
- шлюз для API – вызначае якім чынам кліенты атрымліваюць доступ да сэрвісаў;
- выяўленьне сэрвісаў на баку кліента і на баку сэрвэра – напраўляе запыт кліента да даступнага экзэмпляра сэрвісу;
- Messaging і RPC – два магчымыя спосабы камунікацыі паміж сэрвісамі;
- адзін сэрвіс на хост і шмат сэрвісаў на хост – дзьве магчымыя стратэгіі разгортваньня;
- уласная база для кожнага сэрвісу – вызначае якім чынам сэрвіс захоўвае і апэрыруе з данымі;
- Microservice chassis – пабудова мікрасэрвісаў пры дапамозе адпаведных фрэймворкаў.
![](PatternsRelatedToMicroservices.jpg)
JSON
Стандарт для сеціўных праграмаў – гэта JSON. Ніякага XML, SOAP, WSDL альбо WADL. Толькі JSON! Можна прадстаўляць нешта ў дадатак да JSON, але JSON – гэта мінімум.
Асынхронныя выклікі і WebSocket
Пры разьбіўцы праграмы на невялікія сэрвісы, мы павялічваем колькасьць аддаленых выклікаў. А праблема, злучаная з аддаленымі выклікамі, – гэта хуткасьць выкананьня. Таму трэба прытрымлівацца пэўных правілаў:
- Па-першае, сэрвіс павінен будавацца вакол даменнай вобласьці, каб даныя, якія адносяцца да гэтай вобласьці, знаходзіліся ў межах аднаго сэрвісу, для памяншэньня колькасьці аддаленых выклікаў.
- Нельга ў пошуках меншай колькасьці выклікаў рабіць грувасткі API, калі адзін мэтад прымае стос усялякіх даных, робіць складаныя вылічэньні, і вяртае складаныя аб'екты. Гэта парушае фундамэнтальны прынцып мікрасэрвісаў.
- ужываць рэактыўнае праграмаваньне – асынхронныя выклікі, групаваньне малых выклікаў і агрэгацыя сэрвісаў, неразумныя хуткія каналы сувязі, WebSocket/JSON.
Інструмэнты
Developing high-speed microservices (tools needed): Docker, Rocket, Vagrant, EC2, boto, Chef, Puppet, testing, perf testing.
Service discovery and health: Consul, etcd, Zookeeper, Nagios, Sensu, SmartStack, Serf, StatsD.
Інструмэнты
API Testing
SoapUI allows you to easily and rapidly create and execute automated functional, regression, compliance, and load tests.
Code review
CodeReviewer free tool designed for small teams to manage code review.