在亚马逊网络服务 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 定价不打扰您,您可以这样做:
- 编写一个 lambda 函数,该函数通过 API 服务调用,打开与 SQS 的连接并等待消息。关键是从 HTTP 启动 lambda 调用,但在函数内等待队列(使用 Boto,例如,如果您在 Python 中编写它)。此代码需要创建一个专用于为某个特定客户端提供服务的队列,该队列由客户端传入的 GUID 之类的内容唯一键控。
- Link 使用 Amazon API 服务的 lambda 函数。
- 从浏览器通过 API 调用 lambda 函数并等待它在专用 SQS 队列上接收消息或超时,可能在 API 连接中都使用长轮询和 SQS 连接。为了减少对 API.
的调用次数,这里也建议完全排空队列(或者至少在一个批次中获取尽可能多的消息达到某个限制)。
- 将您的事件发布到与客户端关联的专用 SQS 队列。这将要求发布者知道客户端的唯一密钥。
- Return 作为 lambda 调用的结果从 SQS 读取的事件。
这种方法的一些问题:
- Lambda 定价 - 不是很贵,但像 fanout 这样的东西基本上是免费的
- 每个客户端都需要一个专用的 SQS 队列;清理可能会成为一个问题
- SQS 按呼叫次数计费,包括检查消息。长轮询 SQS 将缓解一些这种情况
- 您需要编写 JavaScript 客户端以长轮询方式重复调用 lambda API 端点
- Lambda 目前在其支持的并发 运行 宁函数数量方面受到限制(目前为 100 个,但您可以联系支持人员以增加数量)
这种方法的一些好处:
- SQS 队列是持久的,因此除非消息被成功处理,否则它将在可见性超时后返回到队列中
- 您可以设置 CloudWatch 来监控所有 API、Lambda 和 SQS 事件
其他注意事项
- 您可以直接从浏览器调用 SQS APIs,方法是使用 Lambda 通过 STS 颁发临时安全凭证。在 JavaScript 中接收消息记录在此处:http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Receiving_a_message 但是,我不知道您是否会 运行 跨域问题。
- 如果 必须 全是 AWS,您唯一的选择是使用负载平衡的 EC2 实例 运行 如您所提到的,使用类似于扇出的东西。
使用扇出功能非常简单:它非常实惠,而且已经构建和测试。
我正在使用 firebase 通知网络浏览器(javascript 客户端)有关特定主题的更改。我对此很开心。但是我真的很想(只)使用 aws 网络服务。
不幸的是,我无法确定是否可以在 aws 上构建这样的服务。我不是在谈论让 EC2 实例 运行 一些 firebase / fanout.io 替代品。我说的是利用 lambda、dynamodb 流、SNS 和 SQS 等服务。
是否有可用的套接字通知服务,或者是否可以使用提供的服务实现类似的功能?
我最近以同样的想法对此进行了研究,但最终我还是决定只使用扇出。 AWS 不提供开箱即用的服务器推送 HTTP 通知服务。
- Lambda 函数按 100 毫秒计费,因此任何针对 lambda 的长轮询最终都会在客户端连接的整个时间内计费。
- SNS 不提供对浏览器的长轮询;可用客户端面向移动、电子邮件、HTTP/S 和其他亚马逊产品,如 Lambda 和 SQS。
- SQS 需要每个客户端一个专用队列,因为它不支持广播。
现在,如果 lambda 定价不打扰您,您可以这样做:
- 编写一个 lambda 函数,该函数通过 API 服务调用,打开与 SQS 的连接并等待消息。关键是从 HTTP 启动 lambda 调用,但在函数内等待队列(使用 Boto,例如,如果您在 Python 中编写它)。此代码需要创建一个专用于为某个特定客户端提供服务的队列,该队列由客户端传入的 GUID 之类的内容唯一键控。
- Link 使用 Amazon API 服务的 lambda 函数。
- 从浏览器通过 API 调用 lambda 函数并等待它在专用 SQS 队列上接收消息或超时,可能在 API 连接中都使用长轮询和 SQS 连接。为了减少对 API. 的调用次数,这里也建议完全排空队列(或者至少在一个批次中获取尽可能多的消息达到某个限制)。
- 将您的事件发布到与客户端关联的专用 SQS 队列。这将要求发布者知道客户端的唯一密钥。
- Return 作为 lambda 调用的结果从 SQS 读取的事件。
这种方法的一些问题:
- Lambda 定价 - 不是很贵,但像 fanout 这样的东西基本上是免费的
- 每个客户端都需要一个专用的 SQS 队列;清理可能会成为一个问题
- SQS 按呼叫次数计费,包括检查消息。长轮询 SQS 将缓解一些这种情况
- 您需要编写 JavaScript 客户端以长轮询方式重复调用 lambda API 端点
- Lambda 目前在其支持的并发 运行 宁函数数量方面受到限制(目前为 100 个,但您可以联系支持人员以增加数量)
这种方法的一些好处:
- SQS 队列是持久的,因此除非消息被成功处理,否则它将在可见性超时后返回到队列中
- 您可以设置 CloudWatch 来监控所有 API、Lambda 和 SQS 事件
其他注意事项
- 您可以直接从浏览器调用 SQS APIs,方法是使用 Lambda 通过 STS 颁发临时安全凭证。在 JavaScript 中接收消息记录在此处:http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Receiving_a_message 但是,我不知道您是否会 运行 跨域问题。
- 如果 必须 全是 AWS,您唯一的选择是使用负载平衡的 EC2 实例 运行 如您所提到的,使用类似于扇出的东西。
使用扇出功能非常简单:它非常实惠,而且已经构建和测试。