Understanding
RabbitMQ Internals

                       2009-07-03
           Accense Technology, Inc.
                    Ryosuke NAKAI
Agenda
Introduction
AMQP?
RabbitMQ?
LShift?
Understanding RabbitMQ Internals
Introduction

Erlang/2, Python/7, Mac/3, VIM/4

XMPP, AMQP, SIP, HTTP, WebSockets

  RADIUS, DNS, DHCP
AMQP?
LShift?
     BBC, MS, Yahoo, T-Mobile, Vodafone

     Erlang

     Java     C#

RabbitMQ
C#           Java


Publisher   Subscriber

                                ...
RabbitMQ?
LShift                   AMQP

Erlang




Mozilla Public License

Erlang                      c_src
RabbitHub

PubSub-over-Webhooks with RabbitHub

MochiWeb

http://code.google.com/p/pubsubhubbub/

http://github.com/tonyg/rabbithub/tree/master
Understanding
RabbitMQ Internals
AMQP

                     ...

Erlang




         ...
tcp_listener.erl, tcp_acceptor.erl

  prim_inet:async_accept

tcp_listener_sup.erl, tcp_acceptor_sup.erl

  one_for_all

  simple_one_for_one

gen_server2, priority_queue

  pcall, pcast

  priority_queue:new, priority_queue:in/out
rabbit_log.erl

  error_logger

  gen_server

rabbit_control.erl

  init:get_plain_arguments

rabbit_tests.erl

rabbit_error_logger.erl

  gen_event
tcp_listener, tcp_acceptor
prim_inet:async_accept
gen_server

  gen_server  gen_tcp:accept
          (OTP     )

  mochiweb, Kai    proc_lib

  RabbitMQ    prim_inet:async_accept
!"#$%&'!()(*$'+#
                        '+#(*,&'-*




               -)($1-*$.%%
                                  -)($1-*$.%%




!"#$%&'!()(*                              !"#$.""(#!-*$'+#
  /-*0(*                                      '+#(*,&'-*




                                                '&2#%($-)($1-*$-)(




                                                       !"#$.""(#!-*
                                                          /-*0(*
one_for_all

tcp_listener            LSock



tcp_listener        tcp_acceptor
tcp_acceptor   supervisor:start_child
simple_one_for_one
one_for_one             supervisor:append_child
        ChildSpec

ListenSocket    start_child



supervisor:start_child(tcp_acceptor_sup, [LSock])

  module, function, [Arg1, Arg2] ++ [LSock]
tcp_listener:init
rabbit_control.erl
erl -extra

  init:get_plain_arguments()

-s module function arg1 arg2 arg3 ...

  default function ... start

-noinput, -hidden, -sname(MUST DNS)

erlang:list_to_atom(Commnad)

  ...(add_user, Node, ...)
fun(I) when .. -> ... (I) when ...




case A of _ when is_record(B) -> ; _ when
is_integer(C) -> ; ... .
Info, Key, Value
rabbit_log
gen_server

  handle_cast       log

error_logger

  info_msg, warning_msg, error_msg

  format, args
rabbit_tests
common_test      EUnit




 test_topic_matching

   passed = test_topic_match(“#”, “test.test”)

   passed = test_topic_match(“#.test”, “test”)

 Cluster   Log
gen_server2 & priority_queue

gen_server2:pcall/3, pcall/4, pcast/3

  pcall(Name, Priority, Request)

  pcall(Name, Priority, Request, Timeout)

  pcast({Name, Node}, Priority, Request)

call/cast
gen_server2

           gen_server    call   cast



gen_server2         priority_queue



priority
priority_queue

Queue = priority_queue:new().

priority_queue:in(X, 5, Queue).

Queue



priority_queue:out(Queue)
rabbit_error_logger

gen_event

  gen_event:add_handler

Exchange

-define(LOG_EXCH_NAME, <<"amq.rabbitmq.log">>).

  topic

RabbitMQ