网站建设+管理系统开发,怎么建立图片的网站,说到很多seo人员都转行了,在线做静态头像的网站如何保证消息的不丢失
消息为什么会丢失 想要保证消息不丢失就要首先知道消息为什么会丢失,在哪个环节会丢失,然后在丢失的环节做处理
1.生产者生产消息发送到broker,broker收到消息后会给生产者发送一个ack指令.生产者接收到broker发送成功的指令,这个时候我们就可以认为消息…如何保证消息的不丢失
消息为什么会丢失 想要保证消息不丢失就要首先知道消息为什么会丢失,在哪个环节会丢失,然后在丢失的环节做处理
1.生产者生产消息发送到broker,broker收到消息后会给生产者发送一个ack指令.生产者接收到broker发送成功的指令,这个时候我们就可以认为消息发送成功了.没有接收到ack指令我们就认为消息发送失败. public T,Throwable void sendEventByKafka(String topic, String content ,T t, KafkaSendErrorCallbackT, java.lang.Throwable function) {kafkaTemplate.send(topic, content).addCallback(success - {log.info(执行kafka消息发送kafka成功);log.info(content);}, failure - {log.error(执行kafka消息发送kafka失败);//失败的消息保存到消息表function.saveMqDb(t,failure);});}上述的逻辑有个前提条件就是,确定broker确实是接受并保存了消息.需要设置ack的级别 acks0不等待确认 在这种模式下生产者发送消息后不会等待来自Broker的任何确认。它会立即继续发送下一条消息。 这是最低延迟的选项但也是最不可靠的因为生产者无法知道消息是否已经成功到达Broker。 acks1Leader确认 在这种模式下生产者发送消息后会等待Broker的领导者Leader确认。领导者会确认消息已经被接收但不一定已经被完全复制到所有的副本。 这种模式提供了一定程度的可靠性因为生产者知道消息至少已经被领导者接收但仍然可能丢失消息因为它们可能还没有被复制到其他副本。 acksall全部确认 这是最可靠的确认模式在这种模式下生产者发送消息后会等待所有的ISRIn-Sync Replicas同步副本确认。ISR是分区的所有副本中与领导者保持同步的副本集合。 在这种模式下消息只有在被领导者和所有同步副本都确认接收后才被视为已提交。这确保了消息的可靠性。
如何保证不重复消费
2.不重复消费,在处理业务时,用唯一建来处理,如果没有唯一建,可以借助消息表来做,处理完了之后给这条消息打个已处理的标记.
.消费者接受消息处理业务给broker发送ack,broker认为消息消费成功,删除这条消息 KafkaListener(id KafkaConstants.MESSAGE_GROUP, topics KafkaConstants.MESSAGE_TOPIC, concurrency 5)public void listen(ConsumerRecord?, ? record, Acknowledgment acknowledgment) {try{//处理业务数据}catch (Exception e){//消费失败后的处理,保存到消息表}finally {//ack确认acknowledgment.acknowledge();}}如何保证消息的顺序
为什么顺序会乱.kafka在生产者生产消息的时候使我们代码控制的,可以保证顺序,比如付款成功后我先发送一个修改订单状态的消息,再发送一个扣减库存的消息,再发送一个物流通知的消息 一个topic 一个partion 代码写入的顺序就是消息的顺序.如果只有一个消费者监听一个partion也是可以保证顺序的.但是多个消费者监听同一个partion消费者2执行完成 消费者1.3还没有执行.这样顺序就乱了. 一个 topic一个 partition一个 consumer内部单线程消费单线程吞吐量太低一般不会用这个。 写 N 个内存 queue具有相同 key 的数据都到同一个内存 queue然后对于 N 个线程每个线程分别消费一个内存 queue 即可这样就能保证顺序性。(我们就是这么干的相同的key的数据在一个队列里面然后使用多线程开worker按照key不同进行分别消费)