《微服务架构设计模式》- 进程间通信

服务发现两种方式

  • 服务及其客户直接与服务注册表交互
  • 通过部署基础设施来处理服务发现(例如网关)

应用层服务发现模式

自注册模式

服务实例向服务注册表注册自己。

客户端发现模式

客户端从服务注册表检索可用服务实例的列表,并在它们之间进行负载均衡。

好处:服务发现机制与具体的部署平台无关

弊端:需要为使用的每种编程语言提供服务发现库。

平台层服务发现模式

第三方注册模式

服务实例由第三方自动注册到服务注册表。

服务端发现

客户端向路由器发出请求,路由器负责服务发现。

好处:服务发现所有方面由部署平台处理,不受语言限制

弊端:仅限支持使用该平台部署的服务

基于异步消息模式的通信

推荐使用消息代理

好处:

  • 松耦合,直接发送到特定通道即可,不需要通过服务发现感知服务实例的网络位置
  • 消息缓存。消息在被处理之前可以被一直缓存
  • 灵活的通信
  • 明确的进程间通信

弊端:

  • 潜在的性能瓶颈
  • 潜在的单点故障
  • 额外的操作复杂性。消息系统需要独立安装、配置、运维

消息架构的设计难题

消息的顺序

多个接收方实例可视为一个消费组

在此示例中,每个Order事件消息都将orderid作为其分片键。特定订单的每个事件都发布到同一个分片,而且该分片中的消息始终由同一个接收方实例读取。因此,这样做就能够保证按顺序处理这些消息。

重复消息

解决方式:

  • 处理程序保证幂等处理
  • 跟踪消息并丢弃重复

事务性消息

使用数据库表作为消息队列

两种方式:

  • 通过轮询模式发布事件 通过轮询数据库中的发件箱来发布消息
  • 使用事务日志拖尾模式发布事件

    使用异步消息提高可用性

    使用异步交互模式

    复制数据

    具体工作过程: