代理程序不是按照其在Kafka中的时间戳顺序提交消息吗?

时间:2018-10-31 06:22:02

标签: java apache-kafka

我有一个场景,其中我部署了多个生产者来生产消息。 该消息包含名为 eventTime 的属性,该属性与引发该特定事件的时间相对应。我想将此 eventTime 设置为ProducerRecord中的时间戳。我已经设置好了。有时可能会发生以下情况:

  1. 假设我要产生2个时间戳为100102的事件。
  2. 我有2位制作人 A B

现在, A 可能会获得带有 102时间戳 首先的消息,然后 B 可能会获得带有以下消息的消息 100时间戳

即先说 A 将首先生成带有 102 时间戳的消息,然后 B 将生成带有强大的> 100 时间戳秒。

因此,消息的顺序将是102,100,而不是100,102。

我尝试了以下方法,但没有一个起作用。

batch.sizelinger.ms设置为较高的值(2216384,1500)-我正在发送一条消息,该消息的密钥为 long 类型,消息为 String < / em>类型。

  //Specify buffer size in config
  props.put("batch.size", 2216384);

  //Reduce the no of requests less than 0   
  props.put("linger.ms", 1500);

new Thread(()->{produce(101,1540964511l,"second","topic-name");}).start();
new Thread(()->{produce(101,1540964498l,"first","topic-name");}).start();

如您所见,上面第一个的时间戳小于第二个的时间戳。理想情况下,应该先 first 使用 first 消息,然后再使用 second 消息(不是这种情况)。请注意,我已经将101用作这两个消息的密钥,并且两个消息的分区也都设置为0。

public static void produce(long id, long timestamp, String msg, String topic)
   {
      System.out.println("producing .. "+msg);
         producer.send(new ProducerRecord<Long, String>(topic, 0,timestamp, id, msg), new Callback(){
            public void onCompletion(RecordMetadata metadata, Exception e)
            {
               System.out.println(metadata);
            }
         });
   }

我也尝试过使用交易,但仍然没有用。

命令

bin/kafka-console-consumer.sh --topic test --partition 0 --bootstrap-server localhost:9092

输出

second
first
first
second
second
first

如果领导者经纪人的工作是随便写入分区,那么生产者API必须提供某种其他方式来按顺序将消息生成给经纪人。

或者至少在代理方,没有一种机制可以等待一段时间,以便在将消息提交到分区之前等待消息?

因此,我的问题是,如何使用其时间戳实现消息的排序?

如果首先产生具有较高时间戳的消息,那么在消息排序的上下文中使用时间戳是什么?

0 个答案:

没有答案