在公司的技術分享,
JMS
•JMS 是什麼:JMS 是 Java 提供的一套技術規範
•JMS 幹什麼用:用來異構系統 集成通信,緩解系統瓶頸,提高系統的伸縮性增強系統用戶體驗, 使得系統模塊化和組件化變得可行並更加靈活
•通過什麼方式:生產消費者模式(生產者、服務器、消費者)
•JMS 核心組件
l Destination:消息發送的目的地,也就是前面說的Queue和Topic。
•l Message :從字面上就可以看出是被髮送的消息。
•l Producer: 消息的生產者,要發送一個消息,必須通過這個生產者來發送。
•l MessageConsumer: 與生產者相對應,這是消息的消費者或接收者,通過它來接收一個消息。
•JMS 消息服務器 ActiveMQ
•ActiveMQ 是 Apache 出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持 JMS1.1 和 J2EE 1.4 規範的。
•主要特點:
–l 多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
–l 完全支持 JMS1.1 和 J2EE 1.4 規範 (持久化,XA 消息,事務)
–l 對 Spring 的支持,ActiveMQ 可以很容易內嵌到使用 Spring 的系統裏面去,而且也支持
–Spring2.0 的特性
–l 通過了常見 J2EE 服務器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過 JCA
–1.5 resource adaptors 的配置,可以讓 ActiveMQ 可以自動的部署到任何兼容 J2EE 1.4 商業服
–務器上
–l 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
–l 支持通過JDBC和journal提供高速的消息持久化
–l 從設計上保證了高性能的集羣,客戶端-服務器,點對點
–l 支持Ajax
–l 支持與Axis的整合
•分佈式消息中間件 Metamorphosis
•Metamorphosis (MetaQ) 是一個高性能、高可用、可擴展的分佈式消息中間件,類似於 LinkedIn 的 Kafka,具有消息存儲順序寫、吞吐量大和支持本地和 XA 事務等特性,適用於大吞吐量、順序消 息、廣播和日誌數據傳輸等場景,在淘寶和支付寶有着廣泛的應用,現已開源。
•主要特點:
•l 生產者、服務器和消費者都可分佈 l 消息存儲順序寫
l 性能極高,吞吐量大
l 支持消息順序
•l 支持本地和XA事務
l 客戶端 pull,隨機讀,利用 sendfile 系統調用,zero-copy ,批量拉數據 l 支持消費端事務
l 支持消息廣播模式
l 支持異步發送消息
l 支持http協議
l 支持消息重試和recover
l 數據遷移、擴容對用戶透明
l 消費狀態保存在客戶端
l 支持同步和異步複製兩種HA
l 支持 group commit
•分佈式消息中間件 RocketMQ
•RocketMQ 是一款分佈式、隊列模型的消息中間件,具有以下特點: l 能夠保證嚴格的消息順序
l 提供豐富的消息拉取模式
l 高效的訂閱者水平擴展能力
•l 實時的消息訂閱機制
l 億級消息堆積能力
l Metaq3.0 版本改名,產品名稱改爲 RocketMQ
Kafka核心組件
•Producer :消息生產者,就是向 kafka broker 發消息的客戶端。
•
•Consumer :
•消息消費者,向 kafka broker 取消息的客戶端
•
•Topic :名稱。
•
•Consumer Group (CG):
•這是 kafka 用來實現一個 topic 消息的廣播(發給所有的 consumer) 和單播(發給任意一個 consumer)的手段。
•
•一個 topic 可以有多個 CG。topic 的消息會複製(不 是真的複製,是概念上的)到所有的 CG,
•但每個 partion 只會把消息發給該 CG 中的一個 consumer。
•如果需要實現廣播,只要每個 consumer 有一個獨立的 CG 就可以了。要實現單播只 要所有的 consumer 在同一個 CG。用 CG 還可以將 consumer 進行自由的分組而不需要多次發送 消息到不同的 topic。
•
•Partition:
•爲了實現擴展性,一個非常大的topic可以分佈到多個broker(即服務器)上,一個 topic 可以分爲多個 partition,每個 partition 是一個有序的隊列。
•partition 中的每條消息都會被分 配一個有序的 id(offset)。kafka 只保證按一個 partition 中的順序將消息發給 consumer,不保 證一個 topic 的整體(多個 partition 間)的順序。
•
•Offset:
•kafka的存儲文件都是按照offset.kafka來命名,用offset做名字的好處是方便查找。例 如你想找位於 2049 的位置,只要找到 2048.kafka 的文件即可。當然 the first offset 就是 00000000000.kafka
•
•Replication:
•Kafka 支持以 Partition 爲單位對 Message 進行冗餘備份,每個 Partition 都可以配 置至少 1 個 Replication(當僅 1 個 Replication 時即僅該 Partition 本身)。
•
•Leader:
•每個Replication集合中的Partition都會選出一個唯一的Leader,所有的讀寫請求都由 Leader 處理。
•其他 Replicas 從 Leader 處把數據更新同步到本地,過程類似大家熟悉的 MySQL 中的 Binlog 同步。
•每個 Cluster 當中會選舉出一個 Broker 來擔任 Controller,負責處理 Partition 的 Leader 選舉,協調 Partition 遷移等工作。
•
•
•SR(In-SyncReplica):
•是Replicas的一個子集,表示目前Alive且與Leader能夠“Catch-up”的 Replicas 集合。由於讀寫都是首先落到 Leader 上,所以一般來說通過同步機制從 Leader 上拉取 數據的Replica都會和Leader有一些延遲(包括了延遲時間和延遲條數兩個維度),任意一個超過閾值都會把該 Replica 踢出 ISR。每個 Partition 都有它自己獨立的 ISR。
•
•
•Consumer 與 topic 關係
•本質上 kafka 只支持 Topic;
•
l 每個 group 中可以有多個 consumer,每個 consumer 屬於一個 consumer group; 通常情況下,一個 group 中會包含多個 consumer,這樣不僅可以提高 topic 中消息的併發消費能 力,而且還能提高"故障容錯"性,如果 group 中的某個 consumer 失效那麼其消費的 partitions 將會有 其他 consumer 自動接管。
•
l 對於Topic中的一條特定的消息,只會被訂閱此Topic的每個group中的其中一個consumer消 費,此消息不會發送給一個 group 的多個 consumer; 那麼一個 group 中所有的 consumer 將會交錯的消費整個 Topic,每個 group 中 consumer 消息消 費互相獨立,我們可以認爲一個 group 是一個"訂閱"者。
•
l 在kafka中,一個partition中的消息只會被group中的一個consumer消費(同一時刻);一個 Topic 中的每個 partions,只會被一個"訂閱者"中的一個 consumer 消費,不過一個 consumer 可 以同時消費多個 partitions 中的消息。
•
l kafka的設計原理決定,對於一個topic,同一個group中不能有多於partitions個數的consumer同
•時消費,否則將意味着某些 consumer 將無法得到消息。
•
•kafka 只能保證一個 partition 中的消息被某個 consumer 消費時是順序的;事實上,從 Topic 角度來說,當有多個 partitions 時,消息仍不是全局有序的。
•
•Producer 客戶端負責消息的分發
•l kafka集羣中的任何一個broker都可以向producer提供metadata信息,這些metadata中包含"
•集羣中存活的 servers 列表"/"partitions leader 列表"等信息;
•l 當 producer 獲取到 metadata 信息之後, producer 將會和 Topic 下所有 partition leader 保持 socket 連接;
•l 消息由producer直接通過socket發送到broker,中間不會經過任何"路由層",事實上,消
•息被路由到哪個 partition 上由 producer 客戶端決定;
•
•比如可以採用"random""key-hash""輪詢等,如果一個 topic 中有多個 partitions,那麼在 producer 端實現"消息均衡分發"是必要的。
l 在producer端的配置文件中,開發者可以指定partition路由的方式。
•Producer 消息發送的應答機制 設置發送數據是否需要服務端的反饋,有三個值 0,1,-1
•0: producer 不會等待 broker 發送 ack
1: 當 leader 接收到消息之後發送 ack
-1: 當所有的 follower 都同步消息成功後發送 ack
•request.required.acks=0
Kafka體驗
kafka-Stream