Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Микросервисы. Мифы и суровая реальность

Микросервисы. Мифы и суровая реальность

Разговоры о микросервисах уже всех порядком достали. Много литературы, докладов и обсуждений, но все кажется оторвано от реальности – половина статей слащаво-приторно заискивающие, а остальные – полны ненависти.

Но есть суровая реальность. Мы два года работаем над переходом Gett от монолитного приложения к микросервисной архитектуре. Gett – международный сервис заказа такси и курьерской доставки, работающий в семидесяти городах и четырех странах. За это время мы столкнулись со множеством проблем, как технических так и организационных. Мой доклад будет посвящен этим проблемах и их решениям.

В докладе я буду развенчивать мифы идеальных микросервисов и рассказывать про разработку в условиях распределенной команды. Также я расскажу какие техники, практики и инструменты мы применяем в боевом коде с учетом специфики разработки на Ruby.

Andrey Deryabin

November 12, 2016
Tweet

More Decks by Andrey Deryabin

Other Decks in Programming

Transcript

  1. James Hughes April 29, 2013 “Microservice Architecture is an architectural

    concept that aims to decouple a solution by decomposing functionality into discrete services”
  2. Shared code – Layout – API Client – Global Configurator

    – Common endpoints - Authoring system
  3. Shared code github 'gettservices/common', branch: 'master' do gem 'gett-api' gem

    'gett-auth' gem 'gett-config' gem 'gett-ops' gem 'gett-ui' end
  4. Common layout # app/views/layouts/application.slim = content_for :head do = stylesheet_link_tag

    'application', media: 'all' = javascript_include_tag 'application' = csrf_meta_tags = render file: 'layouts/gett'
  5. Common layout # gett-ui/app/views/layouts/gett.slim doctype html head meta charset='UTF-8' title=

    "Gett" = stylesheet_link_tag 'ui', media: 'all' = javascript_include_tag 'ui' = yield :head = csrf_meta_tags = favicon_link_tag body data=body_data = yield :end_of_body
  6. Common settings # config/global.yml global: api: open_timeout: 5 read_timeout: 5

    env: US: map_engine: 'google' distance_unit: 'imperial' time_zone: 'Pacific Time (US & Canada)' user_languages: - en-GB - en-US endpoints: user_service: hostname: user.gettservices.com ops: airbrake_api_key: 'xxx'
  7. Common settings - `config/settings/base.yml` - used first in any environment

    - `config/settings/development_or_test.yml` - used in development or test - `config/settings/#{Rails.env}.yml` - used in Rails.env - `config/settings/developer.yml` - developer-specific settings
  8. Common settings Settings.global.api => #<RailsConfig::Options open_timeout=5, read_timeout=5, write_timeout=5, open_timeout_retries=3> Settings.global.env

    => #<RailsConfig::Options US=#<RailsConfig::Options currency="USD", map_center_lat=39.08202, map_center_lng=-94.62726, map_engine="google", distance_unit="imperial", time_zone="Pacific Time (US & Canada)", user_languages=["en-GB", "en-US"]>
  9. Circuit Breaker require 'stoplight' stoplight = Stoplight('ping') { ping 'brug.ru'

    } stoplight.run # => true stoplight.color # => “green" ############## stoplight.run # => false stoplight.color # => "red"
  10. API client class Api::User < Api::Endpoint endpoint :user_service def self.find(env:,

    id:, &block) raise ArgumentError if id.blank? new get "#{env}/users/#{id}", &block end def self.all(env:, &block) wrap get "#{env}/users", &block end end Api::User.all(env: "RU")
  11. Two phase commit 1. Voting Phase • Coordinator sends a

    can_commit? request to all participants • Each participant votes YES/NO to coordinator 2. Completion Phase • Coordinator collects votes and makes the decision • YES Participants wait for a commit! or abort! request.
  12. — Mia Hamm “Failure happens all the time. It happens

    every day in practice. What makes you better is how you react to it”