在亚马逊网络服务 aws 上构建一个 firebase / fanout.io 之类的服务

Build a firebase / fanout.io like service on amazon web services aws

我正在使用 firebase 通知网络浏览器(javascript 客户端)有关特定主题的更改。我对此很开心。但是我真的很想(只)使用 aws 网络服务。

不幸的是,我无法确定是否可以在 aws 上构建这样的服务。我不是在谈论让 EC2 实例 运行 一些 firebase / fanout.io 替代品。我说的是利用 lambda、dynamodb 流、SNS 和 SQS 等服务。

是否有可用的套接字通知服务,或者是否可以使用提供的服务实现类似的功能?

我最近以同样的想法对此进行了研究,但最终我还是决定只使用扇出。 AWS 不提供开箱即用的服务器推送 HTTP 通知服务。

  • Lambda 函数按 100 毫秒计费,因此任何针对 lambda 的长轮询最终都会在客户端连接的整个时间内计费。
  • SNS 不提供对浏览器的长轮询;可用客户端面向移动、电子邮件、HTTP/S 和其他亚马逊产品,如 Lambda 和 SQS。
  • SQS 需要每个客户端一个专用队列,因为它不支持广播。

现在,如果 lambda 定价不打扰您,您可以这样做:

  1. 编写一个 lambda 函数,该函数通过 API 服务调用,打开与 SQS 的连接并等待消息。关键是从 HTTP 启动 lambda 调用,但在函数内等待队列(使用 Boto,例如,如果您在 Python 中编写它)。此代码需要创建一个专用于为某个特定客户端提供服务的队列,该队列由客户端传入的 GUID 之类的内容唯一键控。
  2. Link 使用 Amazon API 服务的 lambda 函数。
  3. 从浏览器通过 API 调用 lambda 函数并等待它在专用 SQS 队列上接收消息或超时,可能在 API 连接中都使用长轮询和 SQS 连接。为了减少对 API.
  4. 的调用次数,这里也建议完全排空队列(或者至少在一个批次中获取尽可能多的消息达到某个限制)。
  5. 将您的事件发布到与客户端关联的专用 SQS 队列。这将要求发布者知道客户端的唯一密钥。
  6. Return 作为 lambda 调用的结果从 SQS 读取的事件。

这种方法的一些问题:

  1. Lambda 定价 - 不是很贵,但像 fanout 这样的东西基本上是免费的
  2. 每个客户端都需要一个专用的 SQS 队列;清理可能会成为一个问题
  3. SQS 按呼叫次数计费,包括检查消息。长轮询 SQS 将缓解一些这种情况
  4. 您需要编写 JavaScript 客户端以长轮询方式重复调用 lambda API 端点
  5. Lambda 目前在其支持的并发 运行 宁函数数量方面受到限制(目前为 100 个,但您可以联系支持人员以增加数量)

这种方法的一些好处:

  1. SQS 队列是持久的,因此除非消息被成功处理,否则它将在可见性超时后返回到队列中
  2. 您可以设置 CloudWatch 来监控所有 API、Lambda 和 SQS 事件

其他注意事项

  1. 您可以直接从浏览器调用 SQS APIs,方法是使用 Lambda 通过 STS 颁发临时安全凭证。在 JavaScript 中接收消息记录在此处:http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Receiving_a_message 但是,我不知道您是否会 运行 跨域问题。
  2. 如果 必须 全是 AWS,您唯一的选择是使用负载平衡的 EC2 实例 运行 如您所提到的,使用类似于扇出的东西。

使用扇出功能非常简单:它非常实惠,而且已经构建和测试。