【问题标题】:Messages order for 2 different subscriptions2 个不同订阅的消息顺序
【发布时间】:2020-03-12 01:17:39
【问题描述】:

我有以下(简化的)设置

消费者(单线程,streamingConnection 是单例)

        val streamingConnection by instance<StreamingConnection>()
        streamingConnection.subscribe(Topics.OUTPUT_ORDER, OrderHandler())
        streamingConnection.subscribe(Topics.OUTPUT_TRANSACTION, TransactionHandler())

Producer(单线程,streamingConnection 是单例)

  • 将消息发布到 Topics.OUTPUT_ORDER
  • 将消息发布到 Topics.OUTPUT_TRANSACTION

nats 流式保证,消费者以相同的顺序接收和处理消息吗?我在交易有效载荷中有订单 ID,在交易处理之前我必须知道订单 ID。

来自 nats java 库说明:

新版本最小化线程。通过依赖底层 NATS 连接中的调度程序,只有一个线程用于所有回调。

如果只有一个线程,消费者的 Topics.OUTPUT_TRANSACTION 处理将被阻塞,直到 Topics.OUTPUT_ORDER onMessage() 处理程序完成。我说的对吗?

【问题讨论】:

    标签: java nats-streaming-server


    【解决方案1】:

    抱歉耽搁了。您正在使用 2 个不同的主题,这意味着在 NATS Streaming 中消息将进入不同的频道。您不能期望以任何特定顺序交付给应用程序。 如果消息发送到同一个通道,那么从单线程生产者发布的消息顺序将与流服务器发送给其消费者的顺序相同。

    【讨论】: