Kafka是什么,JMS是什么,常见的类JMS消息服务器,为什么需要消息队列(来自学习笔记)
1、Kafka是什么
? Apache Kafka是一個開源消息系統(tǒng),由Scala寫成。是由Apache軟件基金會開發(fā)的一個開源消息系統(tǒng)項目。
? Kafka最初是由LinkedIn開發(fā),并于2011年初開源。2012年10月從Apache Incubator畢業(yè)。該項目的目標(biāo)是為處理實時數(shù)據(jù)提供一個統(tǒng)一、高通量、低等待的平臺。
? Kafka是一個分布式消息隊列:生產(chǎn)者、消費者的功能。它提供了類似于JMS的特性,但是在設(shè)計實現(xiàn)上完全不同,此外它并不是JMS規(guī)范的實現(xiàn)。
? Kafka對消息保存時根據(jù)Topic進行歸類,發(fā)送消息者稱為Producer,消息接受者稱為Consumer,此外kafka集群有多個kafka實例組成,每個實例(server)成為broker。
? 無論是kafka集群,還是producer和consumer都依賴于zookeeper集群保存一些meta信息,來保證系統(tǒng)可用性
2、JMS是什么
2.1、JMS的基礎(chǔ)
JMS是什么:JMS是Java提供的一套技術(shù)規(guī)范JMS干什么用:用來異構(gòu)系統(tǒng) 集成通信,緩解系統(tǒng)瓶頸,提高系統(tǒng)的伸縮性增強系統(tǒng)用戶體驗,使得系統(tǒng)模塊化和組件化變得可行并更加靈活
通過什么方式:生產(chǎn)消費者模式(生產(chǎn)者、服務(wù)器、消費者)
jdk,kafka,activemq……
2.2、JMS消息傳輸模型
? 點對點模式(一對一,消費者主動拉取數(shù)據(jù),消息收到后消息清除)
點對點模型通常是一個基于拉取或者輪詢的消息傳送模型,這種模型從隊列中請求信息,而不是將消息推送到客戶端。這個模型的特點是發(fā)送到隊列的消息被一個且只有一個接收者接收處理,即使有多個消息監(jiān)聽者也是如此。
? 發(fā)布/訂閱模式(一對多,數(shù)據(jù)生產(chǎn)后,推送給所有訂閱者)
發(fā)布訂閱模型則是一個基于推送的消息傳送模型。發(fā)布訂閱模型可以有多種不同的訂閱者,臨時訂閱者只在主動監(jiān)聽主題時才接收消息,而持久訂閱者則監(jiān)聽主題的所有消息,即使當(dāng)前訂閱者不可用,處于離線狀態(tài)。
queue.put(object) 數(shù)據(jù)生產(chǎn)
queue.take(object) 數(shù)據(jù)消費
2.3、JMS核心組件
? Destination:消息發(fā)送的目的地,也就是前面說的Queue和Topic。
? Message :從字面上就可以看出是被發(fā)送的消息。
? Producer: 消息的生產(chǎn)者,要發(fā)送一個消息,必須通過這個生產(chǎn)者來發(fā)送。
? MessageConsumer: 與生產(chǎn)者相對應(yīng),這是消息的消費者或接收者,通過它來接收一個消息。
通過與ConnectionFactory可以獲得一個connection
通過connection可以獲得一個session會話。
2.4、常見的類JMS消息服務(wù)器
2.4.1、JMS消息服務(wù)器 ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規(guī)范的。
主要特點:
? 多種語言和協(xié)議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應(yīng)用協(xié)議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
? 完全支持JMS1.1和J2EE 1.4規(guī)范 (持久化,XA消息,事務(wù))
? 對Spring的支持,ActiveMQ可以很容易內(nèi)嵌到使用Spring的系統(tǒng)里面去,而且也支持Spring2.0的特性
? 通過了常見J2EE服務(wù)器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業(yè)服務(wù)器上
? 支持多種傳送協(xié)議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
? 支持通過JDBC和journal提供高速的消息持久化
? 從設(shè)計上保證了高性能的集群,客戶端-服務(wù)器,點對點
? 支持Ajax
? 支持與Axis的整合
? 可以很容易得調(diào)用內(nèi)嵌JMS provider,進行測試
2.4.2、分布式消息中間件 Metamorphosis
Metamorphosis (MetaQ) 是一個高性能、高可用、可擴展的分布式消息中間件,類似于LinkedIn的Kafka,具有消息存儲順序?qū)憽⑼掏铝看蠛椭С直镜睾蚗A事務(wù)等特性,適用于大吞吐量、順序消息、廣播和日志數(shù)據(jù)傳輸?shù)葓鼍?#xff0c;在淘寶和支付寶有著廣泛的應(yīng)用,現(xiàn)已開源。
主要特點:
? 生產(chǎn)者、服務(wù)器和消費者都可分布
? 消息存儲順序?qū)?
? 性能極高,吞吐量大
? 支持消息順序
? 支持本地和XA事務(wù)
? 客戶端pull,隨機讀,利用sendfile系統(tǒng)調(diào)用,zero-copy ,批量拉數(shù)據(jù)
? 支持消費端事務(wù)
? 支持消息廣播模式
? 支持異步發(fā)送消息
? 支持http協(xié)議
? 支持消息重試和recover
? 數(shù)據(jù)遷移、擴容對用戶透明
? 消費狀態(tài)保存在客戶端
? 支持同步和異步復(fù)制兩種HA
? 支持group commit
2.4.3、分布式消息中間件 RocketMQ
RocketMQ 是一款分布式、隊列模型的消息中間件,具有以下特點:
? 能夠保證嚴(yán)格的消息順序
? 提供豐富的消息拉取模式
? 高效的訂閱者水平擴展能力
? 實時的消息訂閱機制
? 億級消息堆積能力
? Metaq3.0 版本改名,產(chǎn)品名稱改為RocketMQ
2.4.4、其他MQ
? .NET消息中間件 DotNetMQ
? 基于HBase的消息隊列 HQueue
? Go 的 MQ 框架 KiteQ
? AMQP消息服務(wù)器 RabbitMQ
? MemcacheQ 是一個基于 MemcacheDB 的消息隊列服務(wù)器。
3、為什么需要消息隊列(重要)**
消息系統(tǒng)的核心作用就是三點:解耦,異步和并行
以用戶注冊的案列來說明消息系統(tǒng)的作用
3.1、用戶注冊的一般流程
問題:隨著后端流程越來越多,每步流程都需要額外的耗費很多時間,從而會導(dǎo)致用戶更長的等待延遲。
3.2、用戶注冊的并行執(zhí)行
問題:系統(tǒng)并行的發(fā)起了4個請求,4個請求中,如果某一個環(huán)節(jié)執(zhí)行1分鐘,其他環(huán)節(jié)再快,用戶也需要等待1分鐘。如果其中一個環(huán)節(jié)異常之后,整個服務(wù)掛掉了。
3.3、用戶注冊的最終一致
1、 保證主流程的正常執(zhí)行、執(zhí)行成功之后,發(fā)送MQ消息出去。
2、 需要這個destination的其他系統(tǒng)通過消費數(shù)據(jù)再執(zhí)行,最終一致。
總結(jié)
以上是生活随笔為你收集整理的Kafka是什么,JMS是什么,常见的类JMS消息服务器,为什么需要消息队列(来自学习笔记)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 婚外情人如何相处才能长久一点(婚外情人如
- 下一篇: 查看当前服务器中的所有的topic,创建