Miroservices与套接字的服务间通信

时间:2017-02-11 17:03:11

标签: node.js sockets network-programming microservices

我目前正在为以下场景设计系统: 数据从客户端流式传输,由多个服务一个接一个地进行处理(不并行)。然后,数据在被分析时被流回客户端。在此过程中服务器将返回客户端部分分析的数据(这就是我需要套接字的原因)非常重要。

客户端甚至可以在服务器上进行分析时发送更多信息,这可能会影响分析结果。

A high level sketch I made

我对此进行了大量研究,我只看到 REST微服务或使用各种消息队列的套接字进行异步处理。 我没有看到任何人在服务之间直接使用这么多打开的套接字来实现微服务。

现在我的问题: 我在这做对了吗?我所有服务器之间的开放套接字是错误还是不可靠?

1 个答案:

答案 0 :(得分:1)

这是一个非常广泛的问题,因此我将尝试就此提出一些广泛的想法:

首先,我认为总体思路非常好。所有的微服务都以这种或那种方式使用套接字,你只需要将它带到较低的层次,而不需要在顶部进行各种抽象。这是有道理的,特别是如果你有一些非常具体的要求。

套接字的数量对我来说似乎不大。我已经看到系统维护了数千个并发的开放套接字十年前。您所建议的内容在现代硬件和操作系统上似乎微不足道。

总的来说,设计完全可行。但问题是你将被迫重新发明一些轮子。我会提到其中一些。

首先,您需要服务发现才能让微服务找到对方。

然后,您需要在每对服务之间设计协议 - 您需要指定何时以及如何发送它们的消息和规则。你需要消息构建器和解析器;以及处理各种消息错误和前向/后向兼容性的逻辑。这比听起来更棘手,特别是如果通信必须是健壮的,这将我带到下一点 - 处理网络故障。

什么网络故障? TCP是可靠的,对吧?好吧,不完全是。首先,存在断开连接和各种网络错误。然后,有一些安静的故障 - 尝试打开一个插座到远程机器,然后突然拉动其网络电缆。本地套接字抛出异常需要多长时间?好吧,事实证明它可能需要分钟,在这段时间你本地套接字认为删除机器还活着。当然,如果它到达,那么它没有错误地以正确的顺序到达。但只有如果它到来。

然后是线程。虽然并非纯粹的套接字所独有,但在较低的抽象级别上,线程往往会更加痛苦。

所以虽然可以做到,但你可能想避免在这里重新发明一些轮子。例如,如何使用RPC库?它们适用于所有现代语言,并且已经解决了您必须处理的一些问题。

相关问题