仲裁隊列
更新時間 2023-07-03 21:30:05
最近更新時間: 2023-07-03 21:30:05
分享文章
介紹分布式消息服務RabbitMQ仲裁隊列功能。
使用場景
仲裁隊列(Quorum Queue)是基于Raft一致性協議實現的一種新型的分布式消息隊列,針對RabbitMQ的鏡像模式設計。仲裁隊列中的消息需要有集群中過半節點同意確認后,才會寫入到隊列中。
仲裁隊列與鏡像隊列的差異
使用鏡像隊列,當生產者發送一條消息,主隊列會將消息同步給鏡像隊列,所有的鏡像隊列都保存消息后,主隊列才會向生產者發送確認。
仲裁隊列的算法是基于Raft共識算法的一個實現。仲裁隊列包含一個主副本和多個從副本,當生產者向主副本發送消息時,主副本會將消息同步給從副本,當超過半數的副本保存消息后,主副本才會向生產者發送確認。并且,主副本的選舉也需要超過半數的副本同意,這會避免出現網絡分區時隊列元數據不一致。所以仲裁隊列有更高的一致性。
配置方法
在聲明隊列時,將隊列的“x-queue-type”參數設置為“quorum”。
以下為java示例
Map arguments = newHashMap<>();
arguments.put("x-queue-type", "quorum");
channel.queueDeclare("test_quorum_queue", true, false, false, arguments);
設置仲裁隊列的長度
通過設置隊列屬性的方式可以限制仲裁隊列的長度和在內存中保存的長度。
x-max-length:仲裁隊列的最大消息數。如果超過則丟棄消息,或者發送到死信交換器。
x-max-length-bytes:仲裁隊列的最大總消息大小(字節數)。如果超過則丟棄消息,或者發送到死信交換器。
x-max-in-memory-length:限制仲裁隊列的內存中最大消息數量。
x-max-in-memory-bytes:限制仲裁隊列的內存中的最大總消息大小(字節數)。