什么是jms
jms(java message service) Java消息服務(wù), jms是一種規(guī)范是jdk底層定義的, 各大廠商對(duì)這個(gè)規(guī)范都是實(shí)現(xiàn)的技術(shù).
jms作用:
在分布式系統(tǒng)當(dāng)中, 系統(tǒng)和系統(tǒng)之間進(jìn)行異步消息傳遞.
同步通訊技術(shù):
代表的技術(shù)有: dubbo, springCloud, webService
技術(shù)特點(diǎn): 例如controller中調(diào)用多個(gè)service, 每個(gè)service的執(zhí)行要等待上一行代碼執(zhí)行完成后才會(huì)繼續(xù)執(zhí)行
下一行代碼.
優(yōu)點(diǎn): 實(shí)時(shí)性比較好, 因?yàn)閏ontroller調(diào)用service, 然后service就去立即執(zhí)行
缺點(diǎn): 執(zhí)行速度慢, 因?yàn)榇a執(zhí)行的順序是串行執(zhí)行, 下一行的代碼執(zhí)行要等待上一行代碼執(zhí)行完成后方可執(zhí)行.
異步通訊技術(shù):
代表的技術(shù)有: jms一系列的, activemq, rabbitmq, rokitmq, zeromq, kafka等
技術(shù)特點(diǎn): 例如controller將消息發(fā)送給消息服務(wù)器, 消息服務(wù)器接收到消息后, 會(huì)以廣播的形式發(fā)給其他處理
具體業(yè)務(wù)的服務(wù)器. 其他具體處理業(yè)務(wù)的服務(wù)器接收到消息后就會(huì)根據(jù)消息完成工作.
優(yōu)點(diǎn): 將以前串行執(zhí)行的業(yè)務(wù)可以改為并行執(zhí)行, 處理速度會(huì)比以前快, 能夠更合理的分配每臺(tái)計(jì)算機(jī)的性能.
缺點(diǎn): 如果消息服務(wù)器正處于繁忙狀態(tài), 那么處理發(fā)消息的任務(wù)可能不及時(shí). 所以對(duì)實(shí)時(shí)性要求不高的業(yè)務(wù)可以使用
這個(gè)技術(shù).
消息中間件技術(shù)分類:使用的時(shí)候用封裝之后的jmsTemplet,它是spring全家桶的一份子,不論使用哪一個(gè)他們底層都是調(diào)用的各自的客戶端工具包,所有會(huì)使用一個(gè)其他的都可以使用了
activeMq: 是apache公司的, 一個(gè)老牌的消息中間件, 性能均衡, 不是最快的, 傳遞數(shù)據(jù)的安全性也不是最好的.
RabbitMQ: 阿里巴巴公司生產(chǎn)的, 它比較安全. 因?yàn)檫@個(gè)中間件有分布式消息級(jí)別事務(wù)功能.
ZeroMQ: 史上最快的隊(duì)列系統(tǒng)
Kafka: 史上最快的消息中間件技術(shù), 可以達(dá)到單機(jī)每秒10萬(wàn)的吞吐量
消息中間件支持的傳輸數(shù)據(jù)對(duì)象的類型:
TextMessage--一個(gè)字符串對(duì)象
MapMessage--一套名稱-值對(duì)
ObjectMessage--一個(gè)序列化的 Java 對(duì)象
BytesMessage--一個(gè)字節(jié)的數(shù)據(jù)流
StreamMessage -- Java 原始值的數(shù)據(jù)流
消息中間件支持的兩種發(fā)送模式:
點(diǎn)對(duì)點(diǎn)(Queue): 一個(gè)消息發(fā)送方, 一個(gè)消息接收方. 相當(dāng)于qq的私聊
如果是多個(gè)發(fā)送方, 一個(gè)接收方也算點(diǎn)對(duì)點(diǎn)模式
訂閱發(fā)布模式(Topic): 一個(gè)消息發(fā)送方, 多個(gè)消息接收方. 相當(dāng)于qq的群聊.
如果多個(gè)發(fā)送方, 多個(gè)接收方也算發(fā)布訂閱模式
activeMq中保證數(shù)據(jù)安全性機(jī)制(保證數(shù)據(jù)不會(huì)丟):
點(diǎn)對(duì)點(diǎn)模式:
a. 發(fā)送方將數(shù)據(jù)發(fā)送給消息服務(wù)器, 進(jìn)入消息服務(wù)器中的隊(duì)列
b. 消息服務(wù)器接收到消息后會(huì)從隊(duì)列中將數(shù)據(jù)發(fā)送給接收方
c. 如果接收方接收到數(shù)據(jù)后, 會(huì)返回響應(yīng)給消息服務(wù)器, 消息服務(wù)器接收到響應(yīng)后認(rèn)為接收成功
這個(gè)時(shí)候會(huì)將這個(gè)數(shù)據(jù)從隊(duì)列中刪除
d. 如果接收方處于宕機(jī)狀態(tài), 無(wú)法接收到數(shù)據(jù), 那么也就無(wú)法返回響應(yīng)給消息服務(wù)器, 消息服務(wù)器在
一段時(shí)間后沒(méi)有接受到接收方的響應(yīng), 則會(huì)認(rèn)為消息接收方宕機(jī), 會(huì)將數(shù)據(jù)從隊(duì)列中拿出來(lái)進(jìn)行持久化
保存到消息服務(wù)器的硬盤(pán)中, 每個(gè)一段時(shí)間會(huì)發(fā)送給消息接收方一次. 直到接收到消息接收方的響應(yīng)
則會(huì)認(rèn)為發(fā)送成功, 將持久化的數(shù)據(jù)刪除