微服务与套接字的服务间通信
Miroservices interservice communication with Sockets
我目前正在为以下场景设计一个系统:
数据从客户端流出,由多个服务一个接一个地处理(非并行)。然后,在分析数据时将数据流式传输回客户端。重要的是,服务器将 return 在此过程中向客户端部分分析数据(这就是我需要套接字的原因)。
客户端甚至可以在服务器端进行分析时发送更多信息,这可能会影响分析结果。
A high level sketch I made
我对此进行了大量研究,但我只看到 REST 微服务 或使用各种 消息队列[=] 的套接字进行异步处理。
我还没有看到任何人在服务之间直接使用这么多打开的套接字来实现微服务。
现在我的问题是:
我在这里做正确的事吗?在我的所有服务器之间打开套接字是否错误或不可靠?
这是一个非常宽泛的问题,所以我将尝试就此给您一些宽泛的想法:
首先,我认为总体思路非常好。所有微服务都以一种或另一种方式使用套接字,您只是将它带到较低级别,而没有在顶部进行各种抽象。这很有意义,尤其是当您有一些非常具体的要求时。
插座的数量对我来说似乎并不多。我在十年前 看到系统维护着数千个并发打开的套接字。您的建议在现代硬件和操作系统上似乎微不足道。
总的来说,该设计完全可行。但问题是你将被迫 re-invent 沿途的一些轮子。我会提到其中的一些。
首先,您需要服务发现 以便微服务相互找到。
然后您需要在每对服务之间设计一个协议 - 您需要指定消息以及何时以及如何发送它们的规则。您需要消息生成器和解析器;以及处理各种消息错误的逻辑,以及 forward/backward 兼容性。这比听起来更棘手,尤其是在通信必须稳健的情况下。这让我想到了下一点 - 处理网络故障。
什么网络故障? TCP 是可靠的,对吧?好吧,不完全是。首先,有断开连接和各种网络错误。然后,有一些安静的故障 - 尝试打开远程机器的套接字,然后 突然 拉它的网线。本地socket多久会抛出异常?好吧,事实证明这可能需要 分钟 ,在此期间您的本地套接字认为移除机器正常运行。当然,如果数据到达,那么它会以正确的顺序无误地到达。但这只是 if 它到达了。
然后是线程。虽然不是纯套接字独有的,但线程在较低的抽象级别上往往更痛苦。
因此,虽然可以做到,但您可能想尽量避免 re-invent 在这里安装一些轮子。例如,使用 RPC 库怎么样?它们适用于所有现代语言,并且已经解决了您必须处理的一些问题。
我目前正在为以下场景设计一个系统: 数据从客户端流出,由多个服务一个接一个地处理(非并行)。然后,在分析数据时将数据流式传输回客户端。重要的是,服务器将 return 在此过程中向客户端部分分析数据(这就是我需要套接字的原因)。
客户端甚至可以在服务器端进行分析时发送更多信息,这可能会影响分析结果。
A high level sketch I made
我对此进行了大量研究,但我只看到 REST 微服务 或使用各种 消息队列[=] 的套接字进行异步处理。 我还没有看到任何人在服务之间直接使用这么多打开的套接字来实现微服务。
现在我的问题是: 我在这里做正确的事吗?在我的所有服务器之间打开套接字是否错误或不可靠?
这是一个非常宽泛的问题,所以我将尝试就此给您一些宽泛的想法:
首先,我认为总体思路非常好。所有微服务都以一种或另一种方式使用套接字,您只是将它带到较低级别,而没有在顶部进行各种抽象。这很有意义,尤其是当您有一些非常具体的要求时。
插座的数量对我来说似乎并不多。我在十年前 看到系统维护着数千个并发打开的套接字。您的建议在现代硬件和操作系统上似乎微不足道。
总的来说,该设计完全可行。但问题是你将被迫 re-invent 沿途的一些轮子。我会提到其中的一些。
首先,您需要服务发现 以便微服务相互找到。
然后您需要在每对服务之间设计一个协议 - 您需要指定消息以及何时以及如何发送它们的规则。您需要消息生成器和解析器;以及处理各种消息错误的逻辑,以及 forward/backward 兼容性。这比听起来更棘手,尤其是在通信必须稳健的情况下。这让我想到了下一点 - 处理网络故障。
什么网络故障? TCP 是可靠的,对吧?好吧,不完全是。首先,有断开连接和各种网络错误。然后,有一些安静的故障 - 尝试打开远程机器的套接字,然后 突然 拉它的网线。本地socket多久会抛出异常?好吧,事实证明这可能需要 分钟 ,在此期间您的本地套接字认为移除机器正常运行。当然,如果数据到达,那么它会以正确的顺序无误地到达。但这只是 if 它到达了。
然后是线程。虽然不是纯套接字独有的,但线程在较低的抽象级别上往往更痛苦。
因此,虽然可以做到,但您可能想尽量避免 re-invent 在这里安装一些轮子。例如,使用 RPC 库怎么样?它们适用于所有现代语言,并且已经解决了您必须处理的一些问题。