簡體   English   中英

使用Spring Data Redis的Redis發布/訂閱:消息以錯誤的順序到達

[英]Redis Pub/Sub with Spring Data Redis: Messages arrive in wrong order

我正在嘗試使用Spring Data Redis的Redis發布/訂閱來實現聊天。

我使用RedisTemplate發布消息,如下所示:

public class RedisPublisher {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void publish(ChannelTopic channelTopic, Object channelMessage) {
        redisTemplate.convertAndSend(channelTopic.getTopic(), channelMessage);
    }
}

為了接收消息,我有一個MessageListener,如下所示:

public class RedisConsumer implements MessageListener {

MessageSerializer serializer = new MessageSerializer();
AtomicInteger atomicInteger = new AtomicInteger(0);

@Override
public void onMessage(Message message, byte[] pattern) {

    Object obj = serializer.deserialize(message.getBody());
    if(obj != null && obj instanceof RedisMessage) {
        System.err.println("Received message(" + atomicInteger.incrementAndGet() + ") " + obj.toString());
    }

}

消息的發布方式如下:

final ChannelTopic channelTopic=connectionManager.subscribe("topic");
    new Thread(new Runnable() {
        public void run() {                
            Thread.sleep(5000);                
            for (int i = 0; i < 10; i++) {
                redisPublisher.publish(channelTopic, new RedisMessage(i + 1));
            }
        }
    }).run();

但是,收到的消息似乎傳遞順序錯誤:

Received message(1) message id: 3
Received message(2) message id: 2
Received message(3) message id: 1
Received message(4) message id: 4
Received message(5) message id: 5
Received message(6) message id: 6
Received message(7) message id: 7
Received message(8) message id: 8
Received message(9) message id: 9
Received message(10) message id: 10

是否可以使用Spring提供的RedisTemplate / MessageListener同步發送/接收消息?

當前的代碼庫很小,可以在GitHub上查看。

Redis的PubSub的是眾所周知的,為了傳遞消息(至少保證,如果你使用一個連接,並觸發PUBLISHPUBLISH命令返回了通知客戶端的數量)。 默認情況下,導致亂序的原因是Spring Data Redis調度消息的方式。 通知是在不同的線程上處理的,這就是原因。 感謝您的代碼,它幫助我快速重現了行為。

我可以想到兩種解決此問題的策略:

  1. 但是,您可以在RedisMessageListenerContainer提供執行該命令的執行RedisMessageListenerContainer 現在,我正在考慮的任何形式的同步都會損害性能。

  2. BinaryJedisPubSub之上實現自己的消息偵聽BinaryJedisPubSub 您可以控制消息,並且可以省略執行程序問題。

HTH,馬克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM