閱讀280 返回首頁    go 阿裏雲 go 技術社區[雲棲]


訂閱關係一致__最佳實踐_消息隊列 MQ-阿裏雲

MQ 裏的一個 Consumer ID 代表一個 Consumer 實例群組。對於大多數分布式應用來說,一個 Consumer ID 下通常會掛載多個 Consumer 實例。訂閱關係一致指的是同一個 Consumer ID 下所有 Consumer 實例的處理邏輯必須完全一致。一旦訂閱關係不一致,消息消費的邏輯就會混亂,甚至導致消息丟失。

由於 MQ 的訂閱關係主要由 Topic+Tag 共同組成,因此,保持訂閱關係一致意味著同一個 Consumer ID 下所有的實例需在以下兩方麵均保持一致:

  1. 訂閱的 Topic 必須一致;

  2. 訂閱的 Topic 中的 Tag 必須一致。

下麵舉幾個反麵例子:

【例一】以下例子中,同一個 Consumer ID 下的兩個實例訂閱的 Topic 不一致。

Consumer 實例 1-1:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, "CID_jodie_test_1");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("jodie_test_A", "*", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println(message.getMsgID());
  7. return Action.CommitMessage;
  8. }
  9. });

Consumer 實例1-2:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, " CID_jodie_test_1");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("jodie_test_B ", "*", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println(message.getMsgID());
  7. return Action.CommitMessage;
  8. }
  9. });

【例二】以下例子中,同一個 Consumer ID 下訂閱 Topic 的 Tag 不一致。Consumer 實例2-1 訂閱了 TagA,而 Consumer 實例2-2 未指定 Tag。

Consumer 實例2-1:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, "CID_jodie_test_2");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("jodie_test_A", "TagA", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println(message.getMsgID());
  7. return Action.CommitMessage;
  8. }
  9. });

Consumer 實例2-2:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, " CID_jodie_test_2");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("jodie_test_A ", "*", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println(message.getMsgID());
  7. return Action.CommitMessage;
  8. }
  9. });

【例三】此例中,錯誤的原因有倆個:

  1. 同一個 Consumer ID 下訂閱 Topic 個數不一致。
  2. 同一個 Consumer ID 下訂閱 Topic 的 Tag 不一致。

Consumer 實例3-1:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, "CID_jodie_test_3");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("jodie_test_A", "TagA", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println(message.getMsgID());
  7. return Action.CommitMessage;
  8. }
  9. });
  10. consumer.subscribe("jodie_test_B", "TagB", new MessageListener() {
  11. public Action consume(Message message, ConsumeContext context) {
  12. System.out.println(message.getMsgID());
  13. return Action.CommitMessage;
  14. }
  15. });

Consumer 實例3-2:

  1. Properties properties = new Properties();
  2. properties.put(PropertyKeyConst.ConsumerId, " CID_jodie_test_3");
  3. Consumer consumer = ONSFactory.createConsumer(properties);
  4. consumer.subscribe("jodie_test_A ", "TagB", new MessageListener() {
  5. public Action consume(Message message, ConsumeContext context) {
  6. System.out.println(message.getMsgID());
  7. return Action.CommitMessage;
  8. }
  9. });

最後更新:2016-11-23 16:04:17

  上一篇:go 消息重試__最佳實踐_消息隊列 MQ-阿裏雲
  下一篇:go 消費冪等__最佳實踐_消息隊列 MQ-阿裏雲