Miroservices与sockets之间的服务间通信

我目前正在为以下场景devise一个系统:数据从客户端stream式传输,由多个服务依次处理(不平行)。 然后,在分析数据的同时将数据传输回客户端。 在这个过程中服务器返回客户端部分分析的数据是非常重要的(这就是为什么我需要套接字)。

客户端甚至可以在服务器分析过程中发送更多的信息,这可能会影响分析结果。

我制作的高级素描

我已经做了大量的研究,我看到只有REST微服务或使用各种消息队列的套接字asynchronous处理。 我还没有看到任何人在这些服务之间直接使用这么多打开的套接字来实现微服务。

现在我的问题是:我在这里做正确的事情吗? 在我所有的服务器之间打开套接字是错误还是不可靠?

这是一个非常广泛的问题,所以我会试着给你一些关于这方面的广泛的想法:

首先,我认为总的想法是完美的。 所有的微服务都使用套接字,你只是把它放在一个较低的层次上,没有各种各样的抽象。 这是有道理的,特别是如果你有一些非常具体的要求。

sockets的数量对我来说似乎不大。 我已经看到十年前系统维护了数千个同时打开的套接字。 你所build议的在现代硬件和操作系统上似乎微不足道。

总的来说,devise是完全可行的 。 但问题是,你将不得不重新发明一些车轮。 我会提到其中的一些。

首先,你需要微服务的服务发现来找对方。

然后你需要在每一对服务之间devise一个协议 – 你需要指定什么时候以及如何发送它们的消息和规则。 你需要消息build立者和parsing器; 以及处理各种消息错误的逻辑,以及向前/向后兼容性。 这比听起来更棘手,特别是如果通信必须是强大的,这使我到下一个点 – 处理networking故障。

什么networking故障? TCP是可靠的,对吗? 那么,不完全。 首先,存在断开和各种networking错误。 然后,有一些安静的失败 – 尝试打开一个远程机器的sockets,然后突然拉动它的networking电缆。 本地套接字需要多长时间才能抛出exception? 那么,事实certificate,它可能需要几分钟 ,在这段时间你本地套接字认为删除机器是活着的,以及。 当然,如果它到达,那么它会以正确的顺序无误地到达。 但是,只有到了。

然后是线程。 虽然对于纯套接字来说不是唯一的,但在较低的抽象层次上,穿线往往更加痛苦。

所以,虽然可以做到,但你可能想要避免在这里重新发明一些车轮。 例如,如何使用RPC库? 它们适用于所有的现代语言,而且已经解决了一些你将要面对的问题。