面试题答案
一键面试实现原理
- 同步发送:
- 生产者发送消息后,会阻塞等待Broker的响应。只有在收到Broker的确认响应(成功或失败)后,才会继续执行后续代码。例如,生产者调用
send
方法发送消息,在Broker返回响应前,线程会一直处于等待状态。这确保了消息发送的结果能够及时反馈给生产者,方便生产者根据发送结果进行相应处理,如发送失败时进行重试等操作。
- 生产者发送消息后,会阻塞等待Broker的响应。只有在收到Broker的确认响应(成功或失败)后,才会继续执行后续代码。例如,生产者调用
- 异步发送:
- 生产者发送消息后,不会阻塞等待Broker的响应,而是立即返回。同时,生产者会注册一个回调函数,当Broker的响应返回时,RocketMQ会通过回调函数将发送结果通知给生产者。比如,生产者调用
send
方法并传入一个SendCallback
回调对象,消息发送后线程继续执行其他任务,当Broker响应到达,会调用SendCallback
中的onSuccess
或onException
方法告知生产者发送结果。
- 生产者发送消息后,不会阻塞等待Broker的响应,而是立即返回。同时,生产者会注册一个回调函数,当Broker的响应返回时,RocketMQ会通过回调函数将发送结果通知给生产者。比如,生产者调用
应用场景
- 同步发送:
- 对消息可靠性要求极高的场景:如银行转账、订单创建等业务场景,这些场景下必须确保消息成功发送到Broker,否则可能导致业务数据不一致。例如银行转账操作,需要确认消息发送成功到Broker后,才能进行后续的资金处理,若消息发送失败则可以及时重试,以保证转账业务的完整性。
- 业务逻辑需要依赖消息发送结果的场景:例如在一个分布式系统中,某个服务需要根据消息发送结果来决定下一步操作,只有收到成功响应,才能继续执行后续复杂的业务流程。
- 异步发送:
- 高并发且对响应时间敏感的场景:像电商系统的商品浏览记录上报、日志记录等场景,这些场景下数据量较大且对消息发送的及时性要求不高,允许消息发送有一定的延迟。例如电商系统在用户浏览商品时,异步发送浏览记录消息,即使消息发送稍有延迟,也不会影响用户正常浏览商品的体验,同时可以提高系统整体的并发处理能力。
- 不需要立即获取发送结果的场景:如一些监控数据的上报,发送监控数据消息后,生产者无需马上知道发送结果,系统可以继续执行其他任务,由回调函数在后续处理发送结果。
性能表现
- 同步发送:
- 优点:由于发送过程是阻塞等待响应,消息发送的可靠性高,能保证消息发送结果的及时反馈,在确保消息成功发送方面有优势。
- 缺点:因为阻塞等待,会占用线程资源,在高并发场景下,线程等待时间会导致系统性能下降,吞吐量较低。例如在每秒有大量消息发送的场景下,大量线程阻塞等待Broker响应,会导致线程资源紧张,影响系统整体的处理能力。
- 异步发送:
- 优点:非阻塞方式使得生产者发送消息后可以立即执行其他任务,提高了线程的利用率,在高并发场景下,系统的吞吐量更高,性能表现更好。例如在高并发的日志记录场景中,异步发送可以显著提高系统处理日志消息的能力。
- 缺点:由于消息发送和结果处理是分离的,通过回调函数处理结果,增加了代码的复杂度和调试难度。同时,如果回调函数处理不当,可能会出现消息发送成功但结果处理异常等情况,影响系统的稳定性。