建筑工程网官方网站,黄骅港务集团有限公司,微信商城怎么注册,网站设计网站建设毕业文稿背景
作为一个合格的码农#xff0c;当然要学会CV大法了#xff0c;可是CV也是有风险的#xff0c;别以为前任写的已经上线那么久了没有问题… 我们需要将埋点信息上报到一个三方平台#xff08;S2S#xff09;接口#xff0c;三方平台对时间有要求#xff0c;同一个用…背景
作为一个合格的码农当然要学会CV大法了可是CV也是有风险的别以为前任写的已经上线那么久了没有问题… 我们需要将埋点信息上报到一个三方平台S2S接口三方平台对时间有要求同一个用户上报同一个埋点事件的时间只能按照顺序上报如果后面上报的事件的时间早于之前已经上报的埋点事件时间那么会被拒绝。
系统
定时任务系统负责查询数据、发送kafka消息Kafka消费系统负责消费kafka消息对消息进行业务处理 我在查询数据时就已经对时间进行排序了保证查询出来的列表是根据时间进行排序的然后进行for循环一条一条的发送kafka消息。然后再kafka消费系统进行消费消息进行上报给平台通过日志看到有很多报错日志提示上报事件的时间早于之前上报的事件时间奇了怪了。我甚至怀疑到kafka消费是不是顺序消费但是通过分析之后发现是发送kafka消息出现了问题…
发送消息 – 错误示例 要是不了解springboot集成的kafka 默认的方法 send(String topic, Nullable V data) 发送消息底层逻辑他也是和我一样的懵逼的。 这个问题就出现在发送kafka的身上…
发送消息-- 正确示例 总结
为什么kafka发送消息无法保证顺序问题
kafka使用send方法不调用get()的话默认是进行异步批量发送消息的这是kafka高吞吐量的一个手段之一这样是无法保证你先调用send方法发送的消息先发送的情况需要进行get方法进行获取到响应也就是同步的意思达到发送的消息有序性的效果。当然同步消耗的性能和时间肯定是没有异步更快的。
为什么kafka消费是可以保证消费消息的有序性
这是个不准确的问题 因为只有在同一个topic下的同一个partition分区下的消息才能保证有序性原因每个主题Topic可以被分割成多个partition 分区而消息在发布时会被分区器Partitioner根据某个属性key进行路由追加到某个partition分区上。而每个partition分区会保证消息的顺序来进行存储因此保证了分区内的消息顺序性。 然后kafka消费会根据partition分区下存储的消息进行按照顺序从前往后进行消费消费后进行提交offset偏移量用于确认消费到哪条消息。
实现消息的顺序消费办法
1、在一个topic中只创建一个partition,这样这个topic下的消息都会按照顺序保存在同一个 partition中这就保证了消息的顺序消费。 2、发送消息的时候指定partition,如果一个topic下有多个partition分区,我们可以把需要保证顺序 的消息都发送到同一个partition中也能做到顺序消费所以上述代码中我需要对同一个用户的事件进行生成一个key保证发送到同一个分区上确保负载均衡和消息的顺序性。