109
Building a Distributed Data Ingestion System with RabbitMQ Alvaro Videla - RabbitMQ

Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

  • Upload
    ontico

  • View
    802

  • Download
    4

Embed Size (px)

DESCRIPTION

Доклад Альваро Видела на HighLoad++ 2014.

Citation preview

Page 1: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Building a Distributed

Data Ingestion System

with RabbitMQAlvaro Videla - RabbitMQ

Page 2: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Alvaro Videla

• Works at RabbitMQ

• Co-Author of RabbitMQ in Action

• Creator of the RabbitMQ Simulator

• Blogs about RabbitMQ Internals: h!p://videlalvaro.github.io/internals.html

• @old_sound — [email protected] — github.com/videlalvaro

Page 3: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

About Me

Co-authored

RabbitMQ in Action

h!p://bit.ly/rabbitmq

Page 4: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

About this Talk

• Exploratory Talk

• A ‘what could be done’ talk instead of ‘this is how you do it’

Page 5: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Agenda

• Intro to RabbitMQ

• The Problem

• Solution Proposal

• Improvements

Page 6: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

h!ps://twi!er.com/spacemanaki/status/514590885523505153

Page 7: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

What is RabbitMQ

Page 9: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

http://www.rabbitmq.com/community-plugins.html

Community Plugins

Page 10: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot

Page 11: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot• PHP

Page 12: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot• PHP

• node.js

Page 13: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot• PHP

• node.js

• Erlang

Page 14: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot• PHP

• node.js

• Erlang

• Java

Page 15: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot• PHP

• node.js

• Erlang

• Java

• Ruby

Page 16: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot• PHP

• node.js

• Erlang

• Java

• Ruby

• .Net

Page 17: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot• PHP

• node.js

• Erlang

• Java

• Ruby

• .Net

• Haskell

Page 18: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Polyglot

Even COBOL!!!11

Page 19: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Some users of RabbitMQ

Page 20: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Some users of RabbitMQ• Instagram

Page 21: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Some users of RabbitMQ• Instagram

• Indeed.com

Page 22: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Some users of RabbitMQ• Instagram

• Indeed.com

• Telefonica

Page 23: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Some users of RabbitMQ• Instagram

• Indeed.com

• Telefonica

• Mercado Libre

Page 24: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Some users of RabbitMQ• Instagram

• Indeed.com

• Telefonica

• Mercado Libre

• Mozilla

Page 25: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

The New York Times on RabbitMQ

This architecture - Fabrik - has dozens of RabbitMQ instances spread across 6 AWS zones in Oregon and Dublin.

Upon launch today, the system autoscaled to ~500,000 users. Connection times remained flat at ~200ms.

h!p://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2014-January/032943.html

Page 26: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

h!p://www.rabbitmq.com/download.html

Unix - Mac - Windows

Page 27: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Messaging with RabbitMQ

h!ps://github.com/RabbitMQSimulator/RabbitMQSimulator

Page 28: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

h!p://tryrabbitmq.com

Page 29: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Simulator

Page 30: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

The Problem

Page 31: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Distributed Application

App

App

App

App

Page 32: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

{ok, Connection} = amqp_connection:start(#amqp_params_network{host = "localhost"}),

{ok, Channel} = amqp_connection:open_channel(Connection),

Data Producer

Obtain a Channel

Page 33: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Declare an Exchange

amqp_channel:call(Channel, #’exchange.declare'{exchange = <<"events">>, type = <<"direct">>}),

Data Producer

Page 34: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

amqp_channel:cast(Channel, #'basic.publish'{ exchange = <<"events">>}, #amqp_msg{props = #'P_basic'{delivery_mode = 2}, payload = <<“Hello Federation">>}),

Publish a message

Data Producer

Page 35: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Obtain a Channel

{ok, Connection} = amqp_connection:start(#amqp_params_network{host = "localhost"}),

{ok, Channel} = amqp_connection:open_channel(Connection),

Data Consumer

Page 36: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

amqp_channel:call(Channel, #'exchange.declare'{exchange = <<"events">>, type = <<"direct">>}),

#'queue.declare_ok'{queue = Queue} = amqp_channel:call(Channel, #'queue.declare'{exclusive = true}),

amqp_channel:call(Channel, #'queue.bind'{exchange = <<"events">>, queue = Queue}),

Declare Queue and bind it

Data Consumer

Page 37: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

amqp_channel:subscribe(Channel, #'basic.consume'{queue = Queue, no_ack = true}, self()),

receive #'basic.consume_ok'{} -> ok end,

loop(Channel).

Start a consumer

Data Consumer

Page 38: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

loop(Channel) -> receive {#'basic.deliver'{}, #amqp_msg{payload = Body}} -> io:format(" [x] ~p~n", [Body]), loop(Channel) end.

Process messages

Data Consumer

Page 39: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Distributed Application

App

App

App

App

Page 40: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Ad-hoc solution

Page 41: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

A process that replicates data to the remote server

Page 42: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Possible issues

Page 43: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Possible issues• Remote server is offline

Page 44: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Possible issues• Remote server is offline

• Prevent unbounded local buffers

Page 45: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Possible issues• Remote server is offline

• Prevent unbounded local buffers

• Prevent message loss

Page 46: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Possible issues• Remote server is offline

• Prevent unbounded local buffers

• Prevent message loss

• Prevent unnecessary message replication

Page 47: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Possible issues• Remote server is offline

• Prevent unbounded local buffers

• Prevent message loss

• Prevent unnecessary message replication

• No need for those messages on remote server

Page 48: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Possible issues• Remote server is offline

• Prevent unbounded local buffers

• Prevent message loss

• Prevent unnecessary message replication

• No need for those messages on remote server

• Messages that became stale

Page 49: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Can we do be!er?

Page 50: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

Page 51: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

Page 52: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation• Supports replication across different administrative domains

Page 53: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation• Supports replication across different administrative domains

• Supports mix of Erlang and RabbitMQ versions

Page 54: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation• Supports replication across different administrative domains

• Supports mix of Erlang and RabbitMQ versions

• Supports Network Partitions

Page 55: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation• Supports replication across different administrative domains

• Supports mix of Erlang and RabbitMQ versions

• Supports Network Partitions

• Specificity - not everything has to be federated

Page 56: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

Page 57: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

Page 58: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

Page 59: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

• It’s a RabbitMQ Plugin

Page 60: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

• It’s a RabbitMQ Plugin

• Internally uses Queues and Exchanges Decorators

Page 61: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

• It’s a RabbitMQ Plugin

• Internally uses Queues and Exchanges Decorators

• Managed using Parameters and Policies

Page 62: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Enabling the Plugin

rabbitmq-plugins enable rabbitmq_federation

Page 63: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Enabling the Plugin

rabbitmq-plugins enable rabbitmq_federation

rabbitmq-plugins enable rabbitmq_federation_management

Page 64: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Federating an Exchange

rabbitmqctl set_parameter federation-upstream my-upstream \ ‘{“uri":"amqp://server-name","expires":3600000}'

Page 65: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Federating an Exchange

rabbitmqctl set_parameter federation-upstream my-upstream \ ‘{“uri":"amqp://server-name","expires":3600000}'

rabbitmqctl set_policy --apply-to exchanges federate-me "^amq\." \ '{"federation-upstream-set":"all"}'

Page 66: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Federating an Exchange

Page 67: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Configuring Federation

Page 68: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Config Options

rabbitmqctl set_parameter federation-upstream \ name ‘json-object’

Page 69: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Config Options

rabbitmqctl set_parameter federation-upstream \ name ‘json-object’

json-object: { ‘uri’: ‘amqp://server-name/’, ‘prefetch-count’: 1000, ‘reconnect-delay’: 1, ‘ack-mode’: on-confirm }

http://www.rabbitmq.com/federation-reference.html

Page 70: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Prevent unbound buffers

expires: N // ms. message-ttl: N // ms.

Page 71: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Prevent message forwarding

max-hops: N

Page 72: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Speed vs No Message Loss

ack-mode: on-confirm ack-mode: on-publish ack-mode: no-ack

Page 73: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

AMQP URI:

amqp://user:pass@host:10000/vhost

http://www.rabbitmq.com/uri-spec.html

Page 74: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Config can be applied via

• CLI using rabbitmqctl

• HTTP API

• RabbitMQ Management Interface

Page 75: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ Federation

Page 76: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

http://www.rabbitmq.com/blog/2012/05/11/some-queuing-theory-throughput-latency-and-bandwidth/

Some Queueing Theory

Page 77: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

RabbitMQ BasicQos Simulator

Page 78: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Prevent Unbound Buffers

https://www.rabbitmq.com/blog/2014/01/23/preventing-unbounded-buffers-with-rabbitmq/

λ = mean arrival time µ = mean service rate if λ > µ what happens?

Page 79: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Prevent Unbound Buffers

https://www.rabbitmq.com/blog/2014/01/23/preventing-unbounded-buffers-with-rabbitmq/

λ = mean arrival time µ = mean service rate if λ > µ what happens? Queue length goes to infinity over time.

Page 80: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Recommended Reading

Performance Modeling and Design of Computer Systems: Queueing Theory in Action

Page 81: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Scaling the Setup

Page 82: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

The Problem

Page 83: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

The Problem

• Queues contents live in the node where the Queue was declared

Page 84: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

The Problem

• Queues contents live in the node where the Queue was declared

• A cluster can access the queue from every connected node

Page 85: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

The Problem

• Queues contents live in the node where the Queue was declared

• A cluster can access the queue from every connected node

• Queues are an Erlang process (tied to one core)

Page 86: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

The Problem

• Queues contents live in the node where the Queue was declared

• A cluster can access the queue from every connected node

• Queues are an Erlang process (tied to one core)

• Adding more nodes doesn’t really help

Page 87: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Enter Sharded Queues

Page 88: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Pieces of the Puzzle

• modulo hash exchange (consistent hash works as well)

• good ol’ queues

Page 89: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Sharded Queues

Page 90: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Sharded Queues

Page 91: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Sharded Queues

Page 92: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Sharded Queues

Page 93: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Sharded Queues

• Declare Queues with name: nodename.queuename.index

Page 94: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Sharded Queues

• Declare Queues with name: nodename.queuename.index

• Bind the queues to a partitioner exchange

Page 95: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Sharded Queues

• Declare Queues with name: nodename.queuename.index

• Bind the queues to a partitioner exchange

• Transparent to the consumer (virtual queue name)

Page 96: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

We need more scale!

Page 97: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Federated Queues

Page 98: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Federated Queues

• Load-balance messages across federated queues

Page 99: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Federated Queues

• Load-balance messages across federated queues

• Only moves messages when needed

Page 100: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Federating a Queue

rabbitmqctl set_parameter federation-upstream my-upstream \ ‘{“uri":"amqp://server-name","expires":3600000}'

Page 101: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Federating a Queue

rabbitmqctl set_parameter federation-upstream my-upstream \ ‘{“uri":"amqp://server-name","expires":3600000}'

rabbitmqctl set_policy --apply-to queues federate-me "^images\." \ '{"federation-upstream-set":"all"}'

Page 102: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

With RabbitMQ we can

Page 103: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

With RabbitMQ we can

• Ingest data using various protocols: AMQP, MQTT and STOMP

Page 104: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

With RabbitMQ we can

• Ingest data using various protocols: AMQP, MQTT and STOMP

• Distribute that data globally using Federation

Page 105: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

With RabbitMQ we can

• Ingest data using various protocols: AMQP, MQTT and STOMP

• Distribute that data globally using Federation

• Scale up using Sharding

Page 106: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

With RabbitMQ we can

• Ingest data using various protocols: AMQP, MQTT and STOMP

• Distribute that data globally using Federation

• Scale up using Sharding

• Load balance consumers with Federated Queues

Page 107: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Credits

world map: wikipedia.org

federation diagrams: rabbitmq.com

Page 108: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Questions?

Page 109: Построение распределенной системы сбора данных с помощью RabbitMQ, Alvaro Videla (Pivotal Inc.)

Alvaro Videla - @old_sound

Thanks!