Даведнік па тэорыі і агульных прынцыпах праграмаваньня

SOLID: Part 1 - The Single Responsibility Principle

Mostly Adequate Guide to functional programming

Рэактыўнае праграмаваньне

Курс на Coursera ад Мартина Одерски

Усяго некалькі гадоў назад вялікія праграмы працавалі на дзесятку сэрвэраў, мелі водгук ў некалькі сэкундаў, падтрымку ў некалькі гадзінаў і гігабайты даных. Сёньняшнія праграмы дэплояцца на ўсё, што заўгодна, пачынаючы ад мабільных прыладаў, да воблачных кластэраў, якія працуюць на тысячах шмат-ядровых працэсараў. Колькасьць даных вымяраецца ў пэтабайтах (1015 байт, альбо 1024 тэрабайт). Адпаведна, учорашнія падыходы да распрацоўкі проста не адпавядаюць сёньняшнім патрабаваньням.

Узгоднены, пасьлядоўны падыход павінен ужывацца з наступнымі складальнікамі.

Responsive

Хуткі водгук праграмы – краевугольны камень прыязных адносінаў да карыстальнікаў. Стабільна хуткі водгук вызначае высокую якасьць сэрвісу, спрашчае апрацоўку памылак, падвышае задавальненьне карыстальнікаў і спрыяе далейшым ітэрацыям.

Resilient

Устойлівасьць да адмовы – здольнасьць праграмы заставацца responsive пры сутыкненьні з памылковай сытуацыяй. Кліент праграмы не павінен абцяжарвацца праблемай апрацоўкі яе памылак.

Elastic

Праграма павінна быць элястычнай – здольнасьць праграмы заставацца responsive нават пры павялічаных нагрузках. Рэактыўная праграма павінна вызваляць рэсурсы пры паніжэньні нагрузкі і наадварот запытваць дадатковыя рэсурсы пры павялічэньні нагрузкі.

Message Driven

Праграма павінна засноўвацца на асынхронным (non blocking) абмене паведамленьняў (падзеяў). Гэта дазваляе ўсталёўваць межы паміж кампанэнтамі, зьмяншаць узаемазалежнасьці і павялічваць ізаляцыю кампанэнтаў аднаго ад іншага. Пры такім падыходзе памылкі таксама перадаюцца паміж кампанэнтамі ў якасьці паведамленьняў (падзеяў).

Распрацоўка API

Simple workflow for building web service APIs

Мікрасэрвісы

RESTful Web Services in Java

Apollo is a set of Java libraries that we use at Spotify when writing microservices.

Building and Running Microservices on OpenShift

serverless.com

https://www.tigerteam.dk/2014/micro-services-its-not-only-the-size-that-matters-its-also-how-you-use-them-part-1/

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

Існуе шэраг іншых патэрнаў дызайну, якія непасрэдна злучаныя з патэрнам мікрасэрвісаў:

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.

comments powered by Disqus
Даведнікі пераехалі на GitHub Pages. Актуальная вэрсія даступная па адрасе: https://yurtsevich.github.io/refs/coding/