在微服务中,我应该使用 [=e10=] 而不是 RPC 来获得更松散耦合的架构吗?
In microservices should i use pub/sub instead RPC to get more loosely couple architecture?
我目前使用 RPC 调用通过 TCP 调用另一个微服务并获得响应,但我认为我可以通过这种方式做到:
在不进行 RPC 调用的情况下,我可以使用 pub/sub 发送到一项服务,发布一些频道,如 request_user 并订阅频道喜欢 object_user_response,然后订阅此 request_user 的其他服务,发布 object_user_response.
像那样:
Service A <-- (sub)object_user_response <------ Redis
Service A --> (pub)request_user -------------> Redis
Service B <-- (sub)request_user <--------------- Redis
Service B --> (pub) object_user_response ------> Redis
收到 object_user_response 后,服务 A 检查用户 ID 是否与函数请求的 ID 相同。
我应该使用 RPC 还是 Pub/sub?
就松耦合架构而言,将数据发送到微服务并从那里获得响应的最正确方法是什么,是使用 RPC 调用还是使用两个 pub/sub,用于请求,另一个用于响应?
其实这个问题没有人能回答。这取决于:-)
一方面,使用 RPC 服务之间的联系更紧密,但另一方面,您拥有更简单的 request/response 通信模型。因此,一个服务发送请求期望来自另一个服务的某种响应,或者如果它不可访问则超时。 RPC with TCP也有session和双向通讯方式。
使用 pub/sub 模型,一个服务发送一些关于某些已发生事件的消息,而不关心另一个服务将如何处理该消息。或者服务将消息发送到一个特定的服务并且不期望来自它的响应 - (单向请求)。当然,第二个服务也可能会向第一个服务发送消息,传递一些工作结果。
松散耦合本身并不是目标 - 它是一种使系统更可靠、稳定、可扩展的方法,但它会带来一些代价、工作开销,在某些情况下这是不可能的或根本没有必要。
因此,您可以根据需要选择第一种或第二种方法。当您不能简单地发送请求并忘记或者它没有意义时使用 RPC,无论如何您都需要响应。 RPC 更容易实现。 Pub/sub 适用于某些“繁重”的后台作业,例如图像、视频、文件处理、发送电子邮件等您发送请求的地方,它将在队列中处理。使用 pub/sub,您可以更有效地利用资源。
取决于您的用例,实际上与 "decoupling" 无关。如果来自生产服务的调用必须等待来自消费服务的响应,那么应该使用同步消息传递 (RPC)。当生产服务发送一条打算由另一个服务使用的消息并在不等待甚至不需要响应的情况下继续其婚姻方式时,使用异步形式的通信,如 pub/sub。
异步通信形式在微服务世界中更可取,因为阻塞线程和等待响应的成本很高。良好的架构将有助于解耦 运行 服务之间的时间依赖性,以便每个服务尽可能独立运行,而不直接依赖其他服务来完成分配给它的工作。
我目前使用 RPC 调用通过 TCP 调用另一个微服务并获得响应,但我认为我可以通过这种方式做到:
在不进行 RPC 调用的情况下,我可以使用 pub/sub 发送到一项服务,发布一些频道,如 request_user 并订阅频道喜欢 object_user_response,然后订阅此 request_user 的其他服务,发布 object_user_response.
像那样:
Service A <-- (sub)object_user_response <------ Redis
Service A --> (pub)request_user -------------> Redis
Service B <-- (sub)request_user <--------------- Redis
Service B --> (pub) object_user_response ------> Redis
收到 object_user_response 后,服务 A 检查用户 ID 是否与函数请求的 ID 相同。
我应该使用 RPC 还是 Pub/sub? 就松耦合架构而言,将数据发送到微服务并从那里获得响应的最正确方法是什么,是使用 RPC 调用还是使用两个 pub/sub,用于请求,另一个用于响应?
其实这个问题没有人能回答。这取决于:-)
一方面,使用 RPC 服务之间的联系更紧密,但另一方面,您拥有更简单的 request/response 通信模型。因此,一个服务发送请求期望来自另一个服务的某种响应,或者如果它不可访问则超时。 RPC with TCP也有session和双向通讯方式。
使用 pub/sub 模型,一个服务发送一些关于某些已发生事件的消息,而不关心另一个服务将如何处理该消息。或者服务将消息发送到一个特定的服务并且不期望来自它的响应 - (单向请求)。当然,第二个服务也可能会向第一个服务发送消息,传递一些工作结果。
松散耦合本身并不是目标 - 它是一种使系统更可靠、稳定、可扩展的方法,但它会带来一些代价、工作开销,在某些情况下这是不可能的或根本没有必要。
因此,您可以根据需要选择第一种或第二种方法。当您不能简单地发送请求并忘记或者它没有意义时使用 RPC,无论如何您都需要响应。 RPC 更容易实现。 Pub/sub 适用于某些“繁重”的后台作业,例如图像、视频、文件处理、发送电子邮件等您发送请求的地方,它将在队列中处理。使用 pub/sub,您可以更有效地利用资源。
取决于您的用例,实际上与 "decoupling" 无关。如果来自生产服务的调用必须等待来自消费服务的响应,那么应该使用同步消息传递 (RPC)。当生产服务发送一条打算由另一个服务使用的消息并在不等待甚至不需要响应的情况下继续其婚姻方式时,使用异步形式的通信,如 pub/sub。
异步通信形式在微服务世界中更可取,因为阻塞线程和等待响应的成本很高。良好的架构将有助于解耦 运行 服务之间的时间依赖性,以便每个服务尽可能独立运行,而不直接依赖其他服务来完成分配给它的工作。