我有一个场景,其中我部署了多个生产者来生产消息。
该消息包含名为 eventTime 的属性,该属性与引发该特定事件的时间相对应。我想将此 eventTime 设置为ProducerRecord
中的时间戳。我已经设置好了。有时可能会发生以下情况:
现在, A 可能会获得带有 102时间戳 首先的消息,然后 B 可能会获得带有以下消息的消息 100时间戳秒
即先说 A 将首先生成带有 102 时间戳的消息,然后 B 将生成带有强大的> 100 时间戳秒。
因此,消息的顺序将是102,100,而不是100,102。
我尝试了以下方法,但没有一个起作用。
将batch.size
和linger.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必须提供某种其他方式来按顺序将消息生成给经纪人。
或者至少在代理方,没有一种机制可以等待一段时间,以便在将消息提交到分区之前等待消息?
因此,我的问题是,如何使用其时间戳实现消息的排序?
如果首先产生具有较高时间戳的消息,那么在消息排序的上下文中使用时间戳是什么?