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

Middleware all the things

Middleware all the things

This short talk describes the heart of Trainline EU architecture, heavily inspired by Rack itself, based on apps and stacks of middlewares, on top on EventMachine.

The slides has been made live at EuRuKo 2017 and talk done there :)

Mehdi Lahmam B.

September 30, 2017
Tweet

More Decks by Mehdi Lahmam B.

Other Decks in Programming

Transcript

  1. Middleware all the
    things

    View Slide

  2. At Trainline,
    we sell train tickets,
    across EU and UK.

    View Slide

  3. View Slide

  4. View Slide

  5. How does it work?
    Frontends Rails API Connections API
    aka connection with carriers APIs

    View Slide

  6. A bunch of middlewares
    Requests are processed by generated apps
    on the fly, which are stacks of middlewares.

    View Slide

  7. Request
    (an environment Hash)
    env[:params][:action]
    Connections API
    Base::Builder.app do
    use DoSomething
    use AnotherThing
    # insert a bunch of cool stuff here
    end

    View Slide

  8. Connections API
    Middleware 1
    An action (an app)
    Middleware 2
    Middleware 3
    ① down ↓ ↑ ④ up
    ② down ↓ ↑ ③ up
    → ⑤ env[:callback]


    View Slide

  9. % tree lib/pacon/actions -L 1
    lib/pacon/actions
    ├── book.rb
    ├── book_subscription.rb
    ├── cancel.rb
    ├── emit.rb
    ├── emit_subscription.rb
    ├── estimate_exchange.rb
    ├── estimate_refund.rb
    ├── exchange.rb
    ├── exchange_pay.rb
    ├── exchange_search.rb
    ├── fetch_pnr.rb
    ├── fetch_subscription.rb
    ├── fetch_travel_document.rb
    ├── immediate_cancel.rb
    ├── load_timetable.rb
    ├── pay.rb
    ├── refund.rb
    └── search.rb

    View Slide

  10. def self.search
    Base::Builder.app do
    use Base::LogAction
    use Base::VolatileStations
    use Base::InitResultCache
    use Base::LogSearchFruitfulness
    use Base::AvoidFruitlessSearch
    use Base::ReportAndBlockCombinations
    use Base::TryAgain
    use Base::SearchWindow
    use Base::FilterUnsellableFolderMix
    use Base::FilterTimetableResults
    use Base::TooManyPassengers
    use Base::WarnDifferentStation
    use Base::Parallel
    end
    end

    View Slide

  11. def self.search
    Base::Builder.app do
    use Base::LogAction
    use Base::VolatileStations
    use Base::InitResultCache
    use Base::LogSearchFruitfulness
    use Base::AvoidFruitlessSearch
    use Base::ReportAndBlockCombinations
    use Base::TryAgain
    use Base::SearchWindow
    use Base::FilterUnsellableFolderMix
    use Base::FilterTimetableResults
    use Base::TooManyPassengers
    use Base::WarnDifferentStation
    use Base::Parallel
    end
    end
    Will call SNCF.search, DB.search…

    View Slide

  12. module SNCF
    class << self
    def search
    Base::Builder.app do
    use SNCF::Stations
    use SNCF::ExtractFoldersFromJourneys
    # tons of very secret sauce
    use SNCF::HttpRequest
    end
    end
    end
    end

    View Slide

  13. Event Machine FTW
    The whole is based on Event Machine to
    coordinate all the parallel requests made to
    carriers APIs.

    View Slide