消息傳遞(Messaging)

圖片來自網絡

概覽

無論是烽火戲諸侯也好,還是暗送秋波也罷,其本質都是消息傳遞(Messaging)
In the beginning,God created the heavens and the earth。當然,耶和華也創造了程序員這一奇葩物種,并且囑咐他:“你繼承了我的創造力,你可以按照自己的喜好來創造世界”。于是,website,app陸續被程序員創造出來,各從其類,應有盡有,構成了如今我們每天都離不開的互聯網世界。在程序員心里,這就是Eden罷,只可惜程序員自己還單身,還被貼上“出軌率最高”的標簽。
人類世界需要溝通,程序的世界也需要溝通,只不過叫它消息傳遞罷了。倘若各模塊間沒有溝通,它們會寂寞死的,更別提服務人類了。本文來總結一下當前主流的信息傳遞技術。首先上圖。

圖1 消息傳遞一覽

如圖1所示,當前主流的消息傳遞大概分為三大方向。基于JMS(Java Message Service)實現的消息代理(Message Broker),優秀代表是ActiveMQ;基于AMQP(Advanced Message Queuing Protocol)實現的消息傳遞,優秀代表是RabbitMQ;基于流式架構(Streaming Architecture)的消息傳遞,優秀代表是Kafka。ActiveMQ,RabbitMQ和Kafka,由前到后,功能越來越強大,前者能干的后者都可以搞定,可謂“青出于藍而勝于藍”。

同步 vs 異步

在你創造的程序世界里,你就是上帝。你創造的世界有許多模塊(線程、進程級),為了讓他們協同工作,少不了消息傳遞。為此,你有兩種選擇。其一是“一條線走到底”,將其他業務邏輯與消息傳遞融為一體,二者順序執行,無論誰出錯都是世界末日,大家一起毀滅。其二是“多條線走”,將消息傳遞的工作交給“天使(angel)”去做,你自己只負責其他業務邏輯。這樣,你的天使在進行消息傳遞時,你可以繼續執行自己的邏輯,不必等待。此外,萬一天使在傳遞消息的過程中被魔鬼干掉了,你仍然可以繼續自己的工作。
一條線走到底”是同步的消息傳遞,“多條線走”是異步的消息傳遞。同步模式通常由RPC(Remote Procedure Call)來實現,異步模式則由消息代理(Message Broker)來實現,本文討論的是后者。

JMS

JMS是Java EE規范之一,第一手資料請去Oracle官網,這里有詳細的介紹,本節圖片也是來自這里。JMS和JDBC是一個模子做出來的東西,也是一個規范(一堆接口),Oracle并沒有實現,實現是由具體的代理商來做的,二者編程思想一樣,首先來看架構圖。

圖2 JMS API編程模型

讓我們由上至下瞅瞅圖2。ConnectionFactory接口是連接工廠,由它負責創建客戶端與消息代理的連接對象Connection,Connection創建Session。拿到Session后,分兩條路走,消息的生產者使用Session創建MessageProducer和Message,之后將消息發到目的地(Destination);消息的接收者使用Session創建MessageConsumer,之后從目的地接收消息。
JMS中消息的目的地是哪里呢?這涉及到JMS的兩種消息傳遞方式(Messaging Styles),PTP和Pub/Sub。
在PTP方式(Point-to-Point Messaging Style)下,消息的目的地是隊列,如圖3所示。
圖3 PTP消息傳遞

PTP的特點是:

每個消息僅有一個消費者。
當生產者發送消息時,不管消費者是否在運行,消費者都可以取到消息。
接收者在成功處理消息后要向隊列作出應答。

在Pub/Sub方式(Publish/Subscribe Messaging Style)下,消息的目的地是主題(Topic),如圖4所示。


圖4 Pub/Sub 消息傳遞

Pub/Sub的特點是:

每個消息可以有多個消費者。
當且僅當消費者訂閱了某個主題并且當生產者發送消息時它在運行,它才能消費發送到該主題的消息。

再看看圖2,我們還發現了一個JMSContext。Oracle官方是這樣解釋JMSContext的。

A JMSContext is the main interface in the simplified JMS API introduced for JMS 2.0. This combines in a single object the functionality of two separate objects from the JMS 1.1 API: a Connection and a Session.

由此可見,JMSContext是JMS2.0中為簡化JMS API而新增的一個主要接口,其功能相當于JMS1.1中Connection和Session兩個對象之和,圖2也形象地反映了這點。JMS2.0對JMS編程模型進行了簡化,這使我們可以更優雅地寫JMS代碼,更多細節,請參考這篇關于JMS2.0的Oracle技術文章

AMQP

Streaming Architecture

Demos

ActiveMQ快速入門

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容