首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring Event框架的6个最佳实践

Spring Event是Spring框架内建的一种发布/订阅(Publish-Subscribe)模式的实现,它允许应用内部不同组件之间通过事件进行通信。当某个特定事件发生时,系统中对这类事件感兴趣的监听器可以接收到通知并执行相应操作。 以下是关于 Spring Event 最佳实践的详细解释:

1. 业务系统一定要先实现优雅关闭服务,才能使用 Spring Event?

 在业务系统中,优雅关闭服务是一项基本的要求。当系统需要停止或重启时,需要确保正在进行的操作能够被正确地完成并且不会造成数据丢失或不一致。使用 Spring Event 时,如果服务在关闭时没有被正确地处理,可能会导致事件丢失或不完整的处理,从而影响系统的正确运行。因此,在使用 Spring Event 之前,务必确保业务系统能够实现优雅关闭服务的机制,以确保事件的正确处理。

2. 为什么服务启动阶段,Spring Event 事件丢失了?

 Spring 在启动阶段会触发一些事件,但在启动过程中,一些事件可能会由于 Spring 上下文尚未完全准备好或者某些 bean 尚未初始化完成而丢失。这可能导致订阅者无法收到预期的事件。为了避免这种情况,可以通过延迟初始化或者在适当的时机注册事件监听器来处理。

3. 强一致性场景不适合订阅发布模式

 在强一致性场景下,要求系统的各个组件的状态是一致的,因此使用订阅发布模式可能会引入额外的复杂性,并且可能导致状态不一致的问题。因为订阅发布模式是异步的,无法保证事件的触发和处理是原子性的,所以在强一致性的场景下不适合使用订阅发布模式。

4. **最终一致性的业务特性适合——发布订阅模式**

 与强一致性相反,最终一致性要求系统最终的状态是一致的,但允许在过程中存在一段时间的不一致。在这种情况下,发布订阅模式可以很好地满足业务的需求,因为它可以异步地处理事件,而不会阻塞主流程,从而提高了系统的响应性和性能。

5. 使用 Spring Event 要有额外的可靠性保证!

 Spring Event 机制是基于观察者模式实现的,而观察者模式是一种松耦合的方式来实现事件处理。但在分布式系统中,由于网络通信、消息传递等原因,可能会导致事件丢失或重复。因此,在使用 Spring Event 时,需要额外的可靠性保证,例如使用消息队列、持久化事件等机制来确保事件的可靠传递和处理。

6. Spring 订阅者务必保证幂等

 在事件驱动的系统中,事件的发布和订阅是异步的,因此可能会导致事件的重复触发。为了确保系统的稳定性和一致性,订阅者必须保证幂等性,即同一个事件多次触发时产生的效果是一致的。这样可以避免因为事件的重复触发而导致数据的错误或系统的不稳定。

Spring Event 和消息队列(MQ)都属于订阅发布模式的应用,但是它们的功能和复杂度有所不同。相比之下,消息队列更为强大且复杂,更适合于应用之间的解耦、隔离和事件通知。例如,订单支付、订单完成、订单履约完成等事件需要在广播后通知下游其他微服务,这种场景更适合使用消息队列。

然而,对于应用内部的订阅发布需求,Spring Event 更为合适。两者并不矛盾,消息队列提供了更强大的功能,技术方案也更加重量级。而 Spring Event 则更为轻量,适合于应用内部的订阅发布,用于实现业务逻辑的解耦。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OudgsdWaYx1_tKN7ZoVDwY2A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券