RabbitMQ

RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQAMQP(高級消息隊列協議)的標準實現。若是不熟悉AMQP,直接看RabbitMQ的文檔會比較困難。不過它也只有幾個關鍵概念,這裏簡單介紹安全

幾個概念說明:服務器

Broker:簡單來講就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪一個隊列。
Queue:消息隊列載體,每一個消息都會被投入到一個或多個隊列。
Binding:綁定,它的做用就是把exchangequeue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker裏能夠開設多個vhost,用做不一樣用戶的權限分離。
producer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每一個鏈接裏,可創建多個channel,每一個channel表明一個會話任務。spa

由Exchange,Queue,RoutingKey三個才能決定一個從Exchange到Queue的惟一的線路。隊列

消息隊列的使用過程大概以下:ssl

1)客戶端鏈接到消息隊列服務器,打開一個channel
  (2)客戶端聲明一個exchange,並設置相關屬性。
  (3)客戶端聲明一個queue,並設置相關屬性。
  (4)客戶端使用routing key,在exchangequeue之間創建好綁定關係。
  (5)客戶端投遞消息到exchange路由

exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏。開發

exchange也有幾個類型,徹底根據key進行投遞的叫作Direct交換機,例如,綁定時設置了routing key」abc」,那麼客戶端提交的消息,只有設置了key」abc」的纔會投遞到隊列。對key進行模式匹配後進行投遞的叫作Topic交換機,符號」#」匹配一個或多個詞,符號」*」匹配正好一個詞。例如」abc.#」匹配」abc.def.ghi」」abc.*」只匹配」abc.def」。還有一種不須要key的,叫作Fanout交換機,它採起廣播模式,一個消息進來時,投遞到與該交換機綁定的全部隊列。文檔

RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,爲了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:
  (1exchange持久化,在聲明時指定durable => 1
  (2queue持久化,在聲明時指定durable => 1
  (3)消息持久化,在投遞時指定delivery_mode=> 21是非持久化)rpc

若是exchangequeue都是持久化的,那麼它們之間的binding也是持久化的。若是exchangequeue二者之間有一個持久化,一個非持久化,就不容許創建綁定。消息隊列

 

def __init__(self,

        host='localhost',

        userid='guest',

        password='guest',

        login_method='AMQPLAIN',

        login_response=None,

        virtual_host='/',

        locale='en_US',

        client_properties=None,

        ssl=False,

        insist=False,

        connect_timeout=None,

        **kwargs): 

  這裏面有個參數叫virtual_host,系統默認是'/', 相似於root。

C++

amqp_rpc_reply_t amqp_login(amqp_connection_state_t state,
                            char const *vhost,
                            int channel_max,
                            int frame_max,
                            int heartbeat,
                            amqp_sasl_method_enum sasl_method,
                            ...)
{
  va_list vl;
  amqp_rpc_reply_t ret;

  va_start(vl, sasl_method);

  ret = amqp_login_inner(state, vhost, channel_max, frame_max, heartbeat,
      &amqp_empty_table, sasl_method, vl);

  va_end(vl);

  return ret; }

相關文章
相關標籤/搜索