【问题标题】:How to design an event listener app to only process events once and also be HA and scalable?如何设计一个事件监听器应用程序只处理一次事件,并且是 HA 和可扩展的?
【发布时间】:2021-11-17 02:52:42
【问题描述】:

我有一个 NodeJs 应用程序作为事件侦听器运行的情况。这个 NodeJs 应用程序通过 websocket 侦听我的应用程序之外的外部事件。

我需要我的 Nodejs 应用程序只处理一次传入的每个事件。

但是,确保这个特定的 NodeJs 应用程序实例可以在需要时自动向上/向下扩展并且高度可用,这样它就不会成为瓶颈,这一点也很重要。

通常,当谈到扩展和 HA 时,我首先想到的是使用负载均衡器运行它的一些实例,或者在 ECS 之类的东西上运行多个容器。这样做会引入 Nodejs 应用程序的多个实例,并且还意味着来自 websocket 的每个相同事件将被接收它的所有实例/容器多次处理。

解决此类问题的好的解决方案和设计是什么?

【问题讨论】:

    标签: amazon-web-services architecture scaling high-availability system-design


    【解决方案1】:

    我不确定我是否完全理解这里的情况,但我认为您的意思是您有一个向其他服务发出的套接字服务器,但是单个实例,即使有专用资源,也会受到瓶颈的影响。

    假设我所说的符合您可能想要查看的问题(不确定您是否使用 socket.io)是 redis socket.io 包。这实际上将使用 redis 来存储套接字,这样您就可以集群您的套接字服务器,而不会让它发送重复或丢失的用户。

    对于您关于规模的问题,您肯定希望为此使用容器,我们实际上使用 digitalocean“应用程序”作为部署容器的简单方法,而无需管理 Kuberneties 和 docker 映像,目前唯一的缺点是没有自动缩放,但只需单击一个按钮,通过警报设置,我们就知道何时放大或缩小。

    通过这种设置,我们的套接字服务器与托管的 redis 服务器一起运行,当我们需要更多的套接字服务器时,我们只需勾选它,我们就有更多的吞吐量。

    【讨论】:

    • 如果我的问题不清楚,我深表歉意。我的意思是我有一个 nodejs 应用程序,它从我的应用程序外部监听外部 websocket 事件。如果我没记错的话,使用 redis 就意味着发布事件。就我而言,我正在尝试监听事件。但我只希望每个事件只处理一次。然而,我想为这个特定的侦听器应用程序提供可伸缩性和 HA。我对 HA 和可扩展性的想法是拥有该应用程序的多个实例,这意味着每个相同的事件都会被处理多次。
    • 所以 redis 可以在这种情况下工作,或者其他 redis 适配器可以用于类似集群等。同样,不确定您是否使用 socket.io,但他们在他们的网站上有文档,但概念是相同的,您需要一种方法来扩展您的套接字服务器,同时保持正确的发射,因为每个连接到其他服务器的客户端都会获得一个唯一的 socket.id,适配器会跟踪它并在服务器上发射将在服务器 2、3 上触发它, 4 等,因此您向通道 A 发出的信号将发送到集群中的所有通道 A 套接字
    • 这是否意味着redis集群将监听外部websocket事件,然后将其传递给与其连接的客户端?
    • 不,redis 只是存储套接字信息的一个,socket.io redis 适配器本质上允许您在集群设置中在代码中运行“发射”,注意发送正确的数据,无论它们连接到什么套接字服务器。查看文档,他们更详细,可能比我在这些小盒子里做得更好:D socket.io/docs/v4/redis-adapter
    • 我明白了。谢谢。就我而言,我真的不必通过套接字发出事件。这些事件是从我的应用程序外部的外部源发出的。考虑第三方来源。我更关心在我的应用程序中接收事件。我希望我的应用程序中从套接字接收事件的部分是 HA。所以我不确定 redis 适配器是否有帮助,因为它是用来发送事件而不是接收事件的?
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多