
1. Kafka 和 RabbitMQ 生產(chǎn)者發(fā)送確認對比1、Kafka 生產(chǎn)者同步發(fā)送 異步發(fā)送producer.send(record)返回Future 對象異步發(fā)送java運行FutureRecordMetadata future producer.send(record);send 直接返回 Future主線程不用阻塞等待 broker 返回結(jié)果消息在后臺發(fā)送。你可以后續(xù)處理 future也可以直接不管靠回調(diào)處理結(jié)果。同步發(fā)送java運行RecordMetadata recordMetadata producer.send(record).get();調(diào)用 Future 的.get()主線程阻塞一直等待 Kafka broker 返回發(fā)送結(jié)果拿到RecordMetadata包含分區(qū)、偏移量等才往下執(zhí)行實現(xiàn)同步。注意get()會拋出異常生產(chǎn)環(huán)境需要捕獲處理消息發(fā)送失敗。2、RabbitMQ 生產(chǎn)者Publisher Confirms發(fā)布者確認RabbitMQ 沒有 Kafka 這種 Futureget 的同步方式用Publisher Confirms 機制 Broker 收到消息之后會給生產(chǎn)者返回ack確認成功或者nack確認失敗。java運行Channel ch ...; //注冊確認回調(diào)ack成功回調(diào)nack失敗回調(diào) ch.addConfirmListener(ackCallback, nackCallback);ackCallbackBroker 正常接收消息觸發(fā)成功回調(diào)nackCallbackBroker 拒絕消息觸發(fā)失敗回調(diào)兩種 MQ 生產(chǎn)者確認核心區(qū)別表格特性Kafka ProducerRabbitMQ Publisher Confirms同步方式send ().get ()阻塞等待 Futurechannel.waitForConfirms () 阻塞異步方式send 帶 Callback 回調(diào)addConfirmListener 監(jiān)聽 ack/nack返回結(jié)果RecordMetadatapartition、offsetack/nack 布爾標識面試要點總結(jié)Kafka send 本身就是異步加 get () 才變成同步不寫 get 就是異步發(fā)送。RabbitMQ PublisherConfirmsBroker 回 ack 代表消息已經(jīng)落盤nack 代表消息丟失業(yè)務(wù)需要做重發(fā)。Kafka 同步發(fā)送性能差會阻塞線程業(yè)務(wù)一般優(yōu)先異步 回調(diào)處理失敗少用.get()。Kafka 也支持異步回調(diào)寫法javaproducer.send(record, new Callback() { Override public void onCompletion(RecordMetadata metadata, Exception exception) { if(exception ! null){ //發(fā)送失敗處理 } } });運行2.