美文网首页
微服务进程间通信 学习记录

微服务进程间通信 学习记录

作者: MlLance | 来源:发表于2020-03-25 20:45 被阅读0次

    学习文章: https://www.nginx.com/blog/introduction-to-microservices/

    • 基于微服务的应用程序是在多台计算机上运行的分布式系统。每个服务实例通常是一个进程。服务必须使用进程间通信(IPC)机制进行交互。

    客户端⇔服务交互方式

    第一个维度是互动是一对一还是一对多:

    • 一对一–每个客户端请求仅由一个服务实例处理。
      • 请求/响应–客户端向服务发出请求并等待响应。客户希望响应能够及时到达。在基于线程的应用程序中,发出请求的线程甚至可能在等待时阻塞。
      • 通知(也称为单向请求)–客户端向服务发送请求,但不希望或未发送答复。
      • 请求/异步响应–客户端将请求发送到服务,该服务以异步方式答复。客户端在等待时不会阻塞,并假设响应可能不会在一段时间内到达。
    • 一对多–每个请求由多个服务实例处理
      • 发布/订阅–客户端发布通知消息,该消息由零个或更多感兴趣的服务使用。
      • 发布/异步响应–客户端发布请求消息,然后等待一定时间以等待感兴趣的服务的响应。

    二个维度是交互是同步还是异步:

    • 同步–客户端期望服务及时响应,甚至在等待时可能会阻塞。
    • 异步–客户端在等待响应时不会阻塞,并且响应(如果有的话)不一定会立即发送。

    API 定义

    API定义的性质取决于您所使用的IPC机制。如果使用消息传递,则API包含消息通道和消息类型。如果使用的是HTTP,则API由URL以及请求和响应格式组成。

    处理部分故障

    • 由于客户端和服务是独立的流程,因此服务可能无法及时响应客户端的请求。服务可能由于故障或维护而关闭。否则服务可能过载,并且对请求的响应非常缓慢。

    方法

    处理部分故障的策略包括:

    • 网络超时–永远不会无限阻塞,并且在等待响应时始终使用超时。使用超时可确保资源不会无限期地被占用。
    • 限制未完成请求的数量–限制客户端可以使用特定服务的未完成请求的数量。如果已达到限制,则发出其他请求可能毫无意义,并且这些尝试必须立即失败。
    • 断路器模式 –跟踪成功和失败请求的数量。如果错误率超过配置的阈值,请使断路器跳闸,以便进一步尝试立即失败。如果大量请求失败,则表明该服务不可用,并且发送请求毫无意义。超时后,客户端应重试,如果成功,则合上断路器。
    • 提供回退–当请求失败时执行回退逻辑。例如,返回缓存的数据或默认值,例如空的建议集。

    IPC技术

    • 基于请求/响应的同步通信机制,例如基于HTTP的REST或Thrift。
    • 于消息的异步通信机制,例如AMQP或STOMP。
    • 基于文本的格式,例如JSON或XML。
    • 使用二进制格式(效率更高),例如Avro或Protocol Buffers。

    基于消息的异步通信

    一条消息由标头(例如发送方之类的元数据)和一条消息主体组成。消息通过通道交换。任何数量的生产者都可以将消息发送到一个频道。同样,任何数量的使用者都可以从频道接收消息。

    点对点渠道和发布订阅渠道。

    • 发布订阅
      image.png
      开源消息传递系统可供选择,包括RabbitMQApache KafkaApache ActiveMQNSQ。在较高级别上,它们都支持某种形式的消息和通道。他们都努力做到可靠,高性能和可扩展。

    消息传递优点
    * 使客户端与服务脱钩–客户端仅通过向适当的通道发送消息即可发出请求。客户端完全不知道服务实例。它不需要使用发现机制来确定服务实例的位置。

    • 消息缓冲–使用同步请求/响应协议(例如HTTP),客户端和服务在交换期间必须都可用。相反,消息代理将写入通道的消息排队,直到消费者可以处理它们为止。例如,这意味着即使订单履行系统很慢或不可用,在线商店也可以接受来自客户的订单。订单消息只是排队。
    • 灵活的客户端-服务交互–消息支持前面描述的所有交互样式。
    • 显式进程间通信–基于RPC的机制试图使调用远程服务看起来与调用本地服务相同。但是,由于物理定律和部分失效的可能性,它们实际上是完全不同的。消息传递使这些差异非常明显,因此开发人员不会陷入错误的安全感中。

    消息传递缺点

    • 额外的操作复杂性–邮件系统是又一个必须安装,配置和操作的系统组件。消息代理必须高度可用,否则系统可靠性会受到影响。
    • 实现基于请求/响应的交互的复杂性–请求/响应式的交互需要一些工作来实现。每个请求消息必须包含一个回复通道标识符和一个相关标识符。服务将包含相关ID的响应消息写入回复通道。客户端使用相关性ID将响应与请求进行匹配。使用直接支持请求/响应的IPC机制通常会更容易。

    同步,请求/响应IPC

    当使用基于请求/响应的同步IPC机制时,客户端会将请求发送到服务。该服务处理请求并发送回响应。其他客户端可能使用异步的,事件驱动的客户端代码,这些代码可能由Futures或Rx Observables封装。但是,与使用消息传递时不同,客户端假定响应将及时到达。有许多协议可供选择。两种流行的协议是REST和Thrift。首先让我们看一下REST。

    REST

    REST是(几乎始终)使用HTTP的IPC机制。REST中的一个关键概念是一种资源,通常代表一个业务对象,例如客户或产品,或业务对象的集合。REST使用HTTP谓词来操纵资源,这些谓词是使用URL引用的。


    image.png

    Apache Thrift

    相关文章

      网友评论

          本文标题:微服务进程间通信 学习记录

          本文链接:https://www.haomeiwen.com/subject/alhxuhtx.html