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

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

1、消息中間件特色:linux

1.1、採用異步處理模式web

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

1.2、應用程序和應用程序調用關係爲鬆耦合關係架構

發送者和接受者沒必要了解對方、只須要確認消息app

發送者和接受者沒必要同時在線異步

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

2、消息傳遞服務模型:ide

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

image.png

2.1.1、點對點模型(PTP)

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

image.png

點對點模型特色:

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

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

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

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

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

這種模式被歸納爲:多個消費者能夠得到消息。在發佈者和訂閱者之間存在時間依賴性。發佈者須要創建一個訂閱(subscription),以便可以消費者訂閱。訂閱者必須保持持續的活動狀態以接受消息,除非訂閱者創建了持久的訂閱。在這種狀況下,在訂閱者未鏈接時發佈的消息將在訂閱者從新鏈接時從新發布。

image.png

發佈/訂閱模型特性:

(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模型。這個模型統一了消息模式,諸如以前提到的發佈/訂閱,隊列,事務以及流數據,而且添加了額外的特性,例如更易於擴展,基於內容的路由。

image.png

image.png

安裝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  顯示全部隊列

注:無論可否解決你遇到的問題,歡迎相互交流,共同提升!

相關文章
相關標籤/搜索