事件处理超时,可以考虑kafka消息处理超时。相当于把当前任务放到队列里面(是一个异步的操作)
如果任务本身是只需要请求不需要得到结果的,则不需要特殊处理。
Kafka消息生产者
Kafka消息消费者
Kafka有一个配置文件,定义topic,消费者和服务者
服务者将消息推到kafka集群,消费者从卡发卡集群取服务
客户端和服务端通过TCP协议通信
一个topic是对一组消息的归纳
在一个可配置的时间段内,Kafka集群保留所有发布的消息,不管这些消息有没有被消费。
Kafka的性能是和数据量无关的常量级的,所以保留太多的数据并不是问题。
Producer将消息发布到它指定的topic中,并负责决定发布到哪个分区。
发布消息两种模式:队列模式和发布-订阅模式(广播)
一般的消息系统:多个消费者同事消费消息,则排队消费,因为消息的发布时异步的,所以导致顺序错乱。
如果使用同步的概念则失去了异步的意义。
Kafka消息系统:Kafka可以在多个consumer组并发的情况下提供较好的有序性和负载均衡。将每个分区分只分发给一个consumer组,这样一个分区就只被这个组的一个consumer消费,就可以顺序的消费这个分区的消息。Kafka只能保证一个分区之内消息的有序性,在不同的分区之间是不可以的。
kafka的使用:
1、kafka配置文件:
生产者的配置:环境的配置、服务端口的配置、最大线程池的配置、渠道的配置、topic的配置
消费者的配置:一个topic对应一组消费者
KafkaConsumerConfig kafkaConsumerConfig = new KafkaConsumerConfig();
kafkaConsumerConfig.setTopic(TOPIC_SMARAT_PRODUCT_EVENT);
kafkaConsumerConfig.setConsumer(productionConsumerService());
list.add(kafkaConsumerConfig);
2、写一个生产者,send(topic,kafkaDataset)
3、写一个消费者,消费消息
需要关注的问题:
数据传输的事务有三种定义:
1、
最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输。
2、最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.
3、精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的。
1、当
consumer或producer失败时怎么样?
(1)producer发布消息时发生了网络错误,没有办法确定是提交前发生的,还是提交后发生的,目前kafka版本没有解决这个问题。
并不是所有的情况都需要“精确的一次”这样高的级别,Kafka允许producer灵活的指定级别。比如producer可以指定必须等待消息被提交的通知,或者完全的异步发送消息而不等待任何通知,或者仅仅等待leader声明它拿到了消息(followers没有必要)。
(2)consumer维护自己消费的消息的offset,如果consumer崩溃了,会有另外一个consumer接着消费消息,它需要从一个合适的offset继续处理。这种情况下可以有以下选择:
- consumer可以先读取消息,然后将offset写入日志文件中,然后再处理消息。这存在一种可能就是在存储offset后还没处理消息就crash了,新的consumer继续从这个offset处理,那么就会有些消息永远不会被处理,这就是上面说的“最多一次”。
- consumer可以先读取消息,处理消息,最后记录offset,当然如果在记录offset之前就crash了,新的consumer会重复的消费一些消息,这就是上面说的“最少一次”。
- “精确一次”可以通过将提交分为两个阶段来解决:保存了offset后提交一次,消息处理成功之后再提交一次。但是还有个更简单的做法:将消息的offset和消息被处理后的结果保存在一起。比如用Hadoop ETL处理消息时,将处理后的结果和offset同时保存在HDFS中,这样就能保证消息和offser同时被处理了。
2、当有多个consumer并行时怎么样?
3、写入硬盘的数据丢失时又会怎么样?
发布消息时,有一个committed的概念,一旦消息被提交了,只要消息被写入的分区的所在的副本broker是活动的,数据就不会丢失。