###### tags: `Plus` `RabbitMQ` # RabbitMQ 學習筆記: ## MQTT與HTTP定位: > > MQTT和HTTP的底層都是TCP/IP,也就是物聯網裝置可以沿用既有的網路架構和設備,只是在網路上流通的「訊息格式」以及應用程式的處理機制不同。 > > ![mqtt_tcp_ip](https://github.com/DukeHuangWP/HackMD/blob/2021-01-01/RabbitMQ%20%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98/mqtt_tcp_ip.png?raw=true) > > ![mqtt_messge](https://github.com/DukeHuangWP/HackMD/blob/2021-01-01/RabbitMQ%20%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98/mqtt_messge.png?raw=true) > > > ![mqtt_message_format](https://github.com/DukeHuangWP/HackMD/blob/2021-01-01/RabbitMQ%20%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98/mqtt_message_format.png?raw=true) > > 使用發佈(Publish) / 訂閱(Subscribe)的機制傳訊,4個主要的元素: > > |QoS類型| > |-| > |發佈者 (Publisher)| > |訂閱者 (Subscriber)| > |主題 (Topic)| > |轉訊站 (Broker)| > > |QoS類型|特性|注意點| > |-|-|-| > |QoS 0| 最多傳送一次(at most once),Broker不會回傳確認封包給Publisher|不保證訊息會送達| > |QoS 1| 至少傳送一次(at least once),Publisher未收到Broker回傳封包時會再度發送| 可能會接收到重複訊息 | > |QoS 2| 確實傳送一次(exactly once),Publisher先與Broker確認連線後, Broker才會發送訊息到Subscriber,並再度與回傳確認封包給Publisher| 最安全可靠,佔用頻寬與傳送時間較多 | > > > ![publisher_broker_subscriber](https://github.com/DukeHuangWP/HackMD/blob/2021-01-01/RabbitMQ%20%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98/publisher_broker_subscriber.png?raw=true) ## Queue隊列處理效果分析: > ##### 異步處理vs同步處理: > <iframe > style="frameborder:0;border:0;scrolling:no;background-color:#4e4e4e;width:100%;height:150px" > src="http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuSf9JIjHACbNACfCpoXHICaiIaqkoSpFuohEpimhI2nAp5KeI4pEJanF3Iwfp4bL04advgNdf79nSS7P2aydz3nRk_J5pAdF9xIztzFnSiRkfmldlT_JgPnUb5XPpPMON99Vf11Qd5ga01RXKe1mT7Nj59GC3NABbHGqddRsFktVyAnlwRCfspHX2cngzFHmg00gGHP0CGlYa1UhkvzjRD94KmWn4uTIe5fa0HH3dqtTyMpohAUxLZ_Vql2ofqKJJItSN5FigckvkFpoIr8LmE6TdwQW0VAWffN2iuw9ptViVTgwyVdQpYUxsio0shaSKlDIW7430000"> > </iframe> > > <iframe > style="frameborder:0;border:0;scrolling:no;background-color:#4e4e4e;width:75%;height:150px" > src=" > http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuSf9JIjHACbNACfCpoXHICaiIaqkoSpFuohEpimhI2nAp5KeI4pEJanF3Iwfp4bL04advgNdf7B1MGhFfsvujdRfYvbJdqzeKr1EBqgihEPIK4XCBialKWWjJYs2Y741nS0yNLqx1IL3WznY9GMDfvszJ_itFEjR-cpADasO0fiQFJqSAe1Aa0KGPiNa0TL2dF1YTVUpZKsQQ4eXfa8KeoabPEopgJkUJPxrTDVgvriQNlQqu3JPDBSOc-fQBh_yabG5S43dfobeWFoeQQNmh6FYynrxdxPkVBwsyyckDXEWRYw7rBmKOAG00000 > "> > </iframe> > > ##### 異步處理使用Queue隊列: > <iframe > style="frameborder:0;border:0;scrolling:no;background-color:#4e4e4e;width:100%;height:300px" > src=" > http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuSf9JIjHACbNACfCpoXHICaiIaqkoSpFuohEpimhI2nAp5KeI4pEJanF3Iwfp4bL04advgNdf7B1MGhFfsvujdRfYvbJdqzeqtYwPDQJNRiq5PJJYn8hgxaK51AJI_AB54ABKuiC8O8eOaPmCOHvJpjxd_PlUDQtzDcKRIWI42jUhEv-jh49HUBPr1tF9izwkclryoqDBtjQk82I40jrTUqKb0mDSekL53IGZTM4gx2fqTF3eGIgneYWAKRuJK4JGJ4EsKkQc4fjWCPYLJjGvgA5D6wZJR4ffxdfjLn--IMf2k14dP-ce06EOqqhXMST4v_sht_HlFVvsiudkzfCWFgng3J2L6bk05Jfa9gN0imh0000 > "> > </iframe> > > <iframe > style="frameborder:0;border:0;scrolling:no;background-color:#4e4e4e;width:100%;height:300px" > src=" > http://www.plantuml.com/plantuml/svg/XT9DIm917CVn-xoAFzl5FIYvH44iuYi88hfr6NJS5dTsPMRs81L4b6ZFKH9vpfC82X6oqBjnPlLTPEwoRAbvMtxxvGCpJ94Bp8HF7UIGYW3X0REjOm5bcv6Ii3qNyQhjrZ3356guLCKMEH1rXy3FR-nQ3a795uJjWUft9s_jyB6HaU-TSH3i-yGdqywrRBxgi64nN3z10BWaF0Q7dB1yDFxQZ6Ihs3DLcnkHge5fojQTV1Ye-wvw-ImK07D8BmX136Up1T3ocvHha4aNUbAOfxdSYYHkZBMAiKP93p6Mf_p8dRNHaIQz6pMyqF-cvWoDseLokReTgwezKiyT6VJ2Z_FfxUN_y49yXlOyGM3-6BmAPEONfU-2QZw5eozvDGpxhN7GsDgXV4bfh2YBn2txrFa6 > "> > </iframe> ## RabbitMQ架構簡介: > > **RabbitMQ三大主體架構:** > * ==Publisher(生產者)== : 即寄信人,負責發送訊息(Message). > * ==Broker(代理人)== : 負責處理訊息傳遞,為RabbitMQ的服務主體:由多個==Virtual Host==組成. > * ==Consumer(消費者)== : 即收件人,接收訊息者. > > **RabbitMQ服務主體Broker(代理人):** > > * ==Broker==為RabbitMQ的服務主體,負責訊息傳遞策略,由多個 ==Virtual Host(虛擬器)== 組成. > * 每個==Virtual Host(虛擬器)== : 由一個==Exchange(交換器)== 與多個==Queue(隊列)== 所組成. > * ==Exchange== 和多個 ==Queue== 之間稱為==Binding(關聯)== (詳細內容請看之後工作模式設置). > * ==Queue== 和多個 ==Consumer(消費者)== 相互==Connecction(連線)== ,透過多個==Channel== 所組成. > > ![publisher_broker_subscriber]( >https://raw.githubusercontent.com/DukeHuangWP/HackMD/2021-01-01/RabbitMQ%20%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98/RabbitMQ_Flow_Diagram.svg > ) > ## RabbitMQ - 安裝: > > 參考: https://www.rabbitmq.com/download.html > https://andyyou.github.io/2017/06/08/rabbitmq-notes/ > #### MacOS - Homebrew 設定 > ==/usr/local/etc/rabbitmq/rabbitmq-env.conf== > ```bash > CONFIG_FILE=/usr/local/etc/rabbitmq/rabbitmq > # NODE_IP_ADDRESS=127.0.0.1 #屏蔽後才能給外網使用amqp > NODENAME=rabbit@localhost > RABBITMQ_LOG_BASE=/usr/local/var/log/rabbitmq > ``` > #### MacOS - Homebrew 設定 > ```bash > #直接启动 > rabbitmq-server > > #后台启动 > rabbitmq-server -detached > > #查询进程 > ps -ef|grep rabbitmq > > #关闭 > rabbitmqctl stop > > #检查状态 > rabbitmqctl status > > rabbitmqctl help > > #add_user username password > rabbitmqctl add_user tonyg changeit > #delete_user username > rabbitmqctl delete_user tonyg > #change_password username newpassword > rabbitmqctl delete_user tonyg > #clear_password username > rabbitmqctl clear_password tonyg > ``` > > #### RabbitMQ Web管理介面 > 官方預設:http://localhost:15672/ > 預設帳號:`guest` > 預設密碼:`guest` > > ![](https://i.imgur.com/WXNb6pz.png) ## RabbitMQ - Exchange Model工作模式: > > ![exchanges]( > https://tedmax100.github.io/images/MQ/exchanges-topic-fanout-direct.png > ) > > ![](https://github.com/DukeHuangWP/HackMD/blob/2021-01-01/RabbitMQ%20%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98/RabbitMQ_WebGUI_Exchanges.png?raw=true) --- > #### Exchange 設置 > |Exchange Type|敘述|Queue RoutingKey|敘述| > |-|-|-|-| > |Fanout|廣播|選用設定| > |Direct|指定|必須設定|RoutingKey必須符合才能消費| > |Topic|規格|選用設定|RoutingKey:`.#` `.*` ` `| > * Topic RoutingKey > > > ` `:只有RoutingKey為空者符合 > > `.#` : ==.!@==、==.99== 不限字數皆符合 > > `.*`: ==.!==、==.99== 字數一位皆符合 > > > |Exchange 參數| 說明 | > |-|-| > |Name| 交換機名稱,消費者與生產者皆需要設定,否則Broker將以預設作代替| > |Type| 交換機工作模式: `Fanout` `Direct` `Topic` `Headers`| > |durable| 交換機名稱,消費者與生產者皆需要設定,否則Broker將以預設作代替| > |autoDelete| 當最後消費完成後自我刪除Queue| > |exclusive| 交換機是否遭單Queue獨佔(僅一個連線能使用其他人使用則回報RESOURCE_LOCKED錯誤)| > |no-wait| | > * ==Exchange 參數不論消費者或生產者設定必須一致避免無法預期的問題== > > > --- > #### Queue 設置 > |Queue 參數| 說明 | > |-|-| > |Name| Queue名稱,消費者需要設定(僅創建時需要設定)| > |durable| Broker關機是否保存Queue| > |autoDelete| 當最後消費完成後自我刪除Queue| > |exclusive| 交換機是否遭消費者獨佔(僅一個連線能使用其他人使用則回報RESOURCE_LOCKED錯誤)| > |no-wait| | > > |Queue Bind 參數| 說明 | > |-|-| > |Exchange Name| 交換機名稱,消費者需要設定(需要在交換機後設定Bind)| > |Queue Name| Queue名稱,消費者需要設定(需要在Queue後設定Bind)| > |durable| Routing Key| > |no-wait| | ## RabbitMQ外網設置 ==/usr/local/etc/rabbitmq== ```bash= CONFIG_FILE=/usr/local/etc/rabbitmq/rabbitmq #NODE_IP_ADDRESS=127.0.0.1 NODENAME=rabbit@localhost RABBITMQ_LOG_BASE=/usr/local/var/log/rabbitmq ```
{"metaMigratedAt":"2023-06-15T17:56:32.647Z","metaMigratedFrom":"Content","title":"RabbitMQ 學習筆記:","breaks":true,"description":"MQTT和HTTP的底層都是TCP/IP,也就是物聯網裝置可以沿用既有的網路架構和設備,只是在網路上流通的「訊息格式」以及應用程式的處理機制不同。","contributors":"[{\"id\":\"867a59a1-af8a-4590-81ea-ca6e662e6b1e\",\"add\":48093,\"del\":69098}]"}
Expand menu