很多公司的架构都存在与外界系统有交互,交互难免会有一些同步请求、回调通知等。且公司一般网络的出入口都是只有一个,而各个业务条线只要存在和外界系统有业务往来,都会存在回调通知,所以可以设计一个公司级别的回调通知,避免重复造轮子,提高科技中心效率,并能统一进行监控、告警等处理。
消息类型
系统之间的交互往往伴随着两大类型的调用,同步、异步调用。
同步
调用者需要等待消息通知方(服务提供者)的响应。
优点:时效性强,可以立即得到结果;
缺点:耦合度高,性能和吞吐能力较差,且在高并发场景下会导致资源浪费和级联失败问题;
异步
调用者无需等待消息通知方(服务提供者)响应,只需保证最终一致性即可。
优点:吞吐量高,耦合度低,能够避免级联失败,适合处理高并发情况;
缺点:架构复杂;
同步调用和异步调用的主要区别在于响应机制、资源利用效率,系统耦合性。异步调用我们可以借助一些中间件来保证消息可靠性。整体架构如下:
容错机制
集群容错机制是分布式系统中的一种关键技术,旨在确保在服务调用过程中即使部分服务实例出现故障,系统依然能稳定运行,如服务提供者故障、网络延迟等。通过配置不同的容错策略,系统可以在服务调用失败时自动切换到其他节点,从而保证服务的连续性和可用性。
常用容错机制有:
- FailoverClusterInvoker:失败自动切换,当出现失败,重试其它服务器。
- FailfastClusterInvoker:快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
- FailsafeClusterInvoker:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
- FailbackClusterInvoker:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
- ForkingClusterInvoker:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=“2” 来设置最大并行数。
- BroadcastClusterInvoker:广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
那这和系统回调有什么关系呢?换一个角度来看,系统回调也是RPC调用的一种方式,同步调用时,可以通过以上容错机制,提高系统可用性。异步调用时,一般采用衰减重试机制进行处理。
消息协议
作为一个公司级别的通用系统回调系统,提供多种消息协议支持也是不可避免的,常用的有:
- HTTP/HTTPS:超文本传输协议。
- Socket:Socket是一种用于实现网络通信的编程接口,通过套接字,应用程序可以进行网络连接、发送和接收数据。
- WebSocket:WebSocket是一种全双工通信协议,通过单个TCP连接实现客户端和服务器之间的双向通信。
- TCP:TCP是一种面向连接的、可靠的传输协议,通过建立可靠的连接来传输数据。
- UDP:UDP是一种无连接的、不可靠的传输协议,通过数据报方式传输数据。
负载均衡
在进行消息回调时,如果系统回调地址存在多个时,还需要提供负载均衡算法,来获取调用服务地址。
监控&告警
一个完善的系统当然少不了监控和告警,在系统回调通知系统设计中,如异步通知失败,同步调用系统监控达到容错值等,都需要进行告警。