1. 程式人生 > >消息中間件的原理及架構框架

消息中間件的原理及架構框架

ora stc 過程 per 解決 smo 客戶端 cto webkit

消息中間件就是在消息的傳輸過程中保存消息的容器。消息中間件再將消息從它的源中繼到它的目標時充當中間人的作用。隊列的主要目的是提供路由並保證消息的傳遞;如果發送消息時接收者不可用,消息隊列會保留消息,直到可以成功的傳遞它為止,當然,消息隊列保存消息也是有期限點的。

一、消息中間件特點:

1.1、采用異步處理模式

消息發送者可以發送一個消息而無須等待響應。消息發送者將消息發送到一條虛擬的通道(主題或隊列)上,消息接受者則訂閱或是監聽該通道。一條消息可能最終轉發給一個或多個消息接受者,這些接受者都無須對消息發送者做出同步回應。整個過程是異步的。比如用戶消息註冊,註冊完畢後過段時間發送郵件或者短息

1.2、應用程序和應用程序調用關系為松耦合關系

發送者和接受者不必了解對方、只需要確認消息

發送者和接受者不必同時在線

比如在線交易系統為了保證數據的最終一致,在支付系統處理完成後會把支付結果放到消息中間件裏通過訂單系統修改訂單支付狀態。兩個系統通過 消息中間件解耦

二、消息傳遞服務模型:

2.1、消息中間件的傳遞模型:

技術分享圖片

2.1.1、點對點模型(PTP)

點對點模型用於消息生產者和消息消費者之間點對點的通信。消息生產者將消息發動到由某個名字標識的特定消費者。這個名字實際上對應於消息服務中的一個隊列(Queue),在消息傳送給消費者之前它被存儲在這個隊列中。隊列消息可以放在內存中也可以是持久的,以保證在消息服務出現故障時扔然能夠傳遞消息

技術分享圖片

點對點模型特點:

(1)、每個消息只用一個消費者

(2)、發送者和接受者沒有時間依賴

(3)、接受者確認消息接受和處理成功

2.1.2、發布-訂閱模型(Pub/Sub)

發布者/訂閱者模型支持向一個特定的消息主題生產消息。0或多個訂閱者可能對接收來自特定消息主題的消息感興趣。在這種模型下,發布者和訂閱者彼此不知道對方。這種模式好比是匿名公告板。

這種模式被概括為:多個消費者可以獲得消息。在發布者和訂閱者之間存在時間依賴性。發布者需要建立一個訂閱(subscription),以便能夠消費者訂閱。訂閱者必須保持持續的活動狀態以接受消息,除非訂閱者建立了持久的訂閱。在這種情況下,在訂閱者未連接時發布的消息將在訂閱者重新連接時重新發布。

技術分享圖片

發布/訂閱模型特性:

(1)、每個消息可以有多個訂閱者

(2)、客戶端只有訂閱後才能接收到消息

(3)、持久訂閱和非持久訂閱

發布/訂閱模型特點:

(1)、發布者和訂閱者有時間依賴

接收者和發布者只有建立訂閱關系才能收到消息

(2)、持久訂閱

訂閱關系建立後,消息就不會消失,不管訂閱者是否都在線

(3)、非持久訂閱

訂閱者為了接收消息、必須一直在線,當只有一個訂閱者時約等於點對點模式

2.2、消息中間件分類:

2.2.1(push)推消息模型:消息生產者將消息發送給消息傳遞服務,消息傳遞服務又將消息推送給消息消費者。

2.2.2(pull)拉消息模型:消費者請求消息服務接收消息,消息生產者從消息中間件拉該消息。

Metaq

Rabbitmq是一個在AMQP協議標準基礎上完整的,可復用的企業消息系統。采用Erlang實現的工業級的消息隊列(MQ)服務器。

AMQP(高級消息隊列協議)是一個異步消息傳遞所使用的應用層協議規範,作為線路層協議,而不是API(例如JMS)AMQP客戶端能夠無視消息的來源任意發送和接收信息。AMQP的原始用途只是為金融界提供一個可以彼此協作的消息協議,而現在的目標則是為通用消息隊列架構提供通用構建工具。因此,面向消息的中間件(MOM)系統,例如發布/訂閱隊列,沒有作為基本元素實現。反而通過發送簡化的AMQ實體,用戶被賦予了構建例如這些實體的能力。這些實體也是規範的一部分,形成了在線路層協議頂端的一個層級:AMQP模型。這個模型統一了消息模式,諸如之前提到的發布/訂閱,隊列,事務以及流數據,並且添加了額外的特性,例如更易於擴展,基於內容的路由。

技術分享圖片

技術分享圖片

安裝Rabbitmq:

[root@linux-node3 ~]# wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

[root@linux-node3 ~]# rpm -ivh epel-release-6-8.noarch.rpm

[root@linux-node3 ~]# yum install -y rabbitmq-server

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server start

[root@linux-node3 ~]# chkconfig rabbitmq-server on

[root@linux-node3 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins list ##列出所有的插件

[root@linux-node3 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management ##啟用web監控插件

The following plugins have been enabled:

mochiweb

webmachine

rabbitmq_web_dispatch

amqp_client

rabbitmq_management_agent

rabbitmq_management

Plugin configuration has changed. Restart RabbitMQ for changes to take effect.

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server restart

Restarting rabbitmq-server: SUCCESS

rabbitmq-server.

[root@linux-node3 ~]# netstat -lntup|grep 5672

tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 2939/beam.smp

tcp 0 0 0.0.0.0:55672 0.0.0.0:* LISTEN 2939/beam.smp

tcp 0 0 :::5672 :::* LISTEN 2939/beam.smp

[root@linux-node3 ~]# rabbitmqctl add_vhost test ##創建vhosttest

Creating vhost "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl list_vhosts ##遍歷所有虛擬主機信息

Listing vhosts ...

/

test

...done.

[root@linux-node3 ~]# rabbitmqctl add_user test 123456 ##添加用戶及密碼

Creating user "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl set_user_tags test administrator ##設置用戶test的角色

Setting tags for user "test" to [administrator] ...

...done.

[root@linux-node3 ~]#rabbitmqctl set_permissions -p test test ".*" ".*" ".*" ##綁定權限,並且具備讀寫的權限

Setting permissions for user "test" in vhost "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl list_queues ##顯示所有隊列

Listing queues ...

...done.

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server restart ##一定要restart

Restarting rabbitmq-server: SUCCESS

rabbitmq-server.

常用命令:

/etc/init.d/rabbitmq-server start|restart|stop|reload

rabbitmqctl add_vhost vhostname 創建vhost

rabbitmqctl delete_vhost vhostname 刪除vhost

rabbitmqctl list_vhosts 遍歷所有虛擬主機信息

rabbitmqctl add_user username password 添加用戶及密碼

rabbitmqctl change_password username newpassword 修改用戶密碼

rabbitmqctl set_user_tags username administrator 設置username的角色(administrator)

rabbitmqctl set_permissions -p vhost user ".*" ".*" ".*" 綁定權限,並且具備讀寫的權限

rabbitmqctl list_queues 顯示所有隊列

註:不管能否解決你遇到的問題,歡迎相互交流,共同提高!

消息中間件的原理及架構框架