如何将持久化事件从中央服务器推送到其他服务器?

How to push persistent events from a central server to others?

我有一个系统,由一台中央服务器、许多移动客户端和许多工作服务器组成。每个工作服务器都有自己的数据库,并且可能位于客户基础设施上(当他购买内部安装时)。

在我当前的设计中,移动客户端将更新发送到中央服务器,中央服务器更新其数据库。工作服务器定期拉取中心以获取更新信息。这 "pull model" 创建了很多请求,但仍然不够,因为工作人员经常使用过时的信息。

我想要一个 "push model",其中中央服务器可以 "post" 更新到 "somewhere",从而保留最新版本的数据。然后工作人员可以 "subscribe" 到此 "somewhere" 并始终保持最新状态。

主要问题是:

  1. 发生更新时,工作服务器可能处于离线状态。当它重新联机时,它应该会收到它丢失的更新。
  2. 可能会创建一个新的工作服务器并需要获取更新的数据,甚至是在它存在之前发布的数据。

加分:

  1. 不需要自己管理 "somewhere"。我的应用程序部署在 AWS,所以如果有任何服务组合我可以用来实现它,那就太好了。我发现的所有内容的数据保留时间都是有限的。

推送模型的问题是:

  • 如果客户端离线,中央系统将需要一个重试方法,这将产生比推送模型更多的请求
  • 客户端可能在防火墙后面,因此无法接收消息
  • 不可扩展

拉模型效率更高:

  • 客户端应该在启动时检索最新的数据,并且每隔一段时间也会检索一次
  • 新客户端只需连接到中央服务器——无需使用客户端列表更新中央服务器(取决于您的安全需求)
  • 它更具可扩展性

为拉取请求提供流量有多种选择

  • 通过 API 调用,由 AWS API 网关提供支持。然后,您需要 AWS Lambda 函数或 Web 服务器来处理请求。
  • 直接来自 DynamoDB(但客户端需要访问凭据)
  • 来自 Amazon S3 存储桶

使用 S3 存储桶有许多优点:高度可扩展,范围广泛的安全选项(public;通过凭据;通过预签名 URL),没有需要服务器。

只需将数据放入 S3 存储桶,然后让客户端 "pull" 获取数据。您可以为 "every" 个客户端设置一组文件,并为每个单独的客户端设置一个特定文件,从而实现单独配置。只需将 S3 视为一个 非常大的键值数据存储 .