我正在实施通过Google云消息传递和Firefox推送通知系统发送浏览器推送通知。为此,我们必须向GCM和FPNS发出HTTP Post请求。
要向GCM / FPNS发出HTTP请求,我们应该有用户注册ID。使用JavaScript我们正在收集注册ID并将其存储在Cassandra中。每条记录都包含用户注册信息(注册ID和浏览器类型)。
当我们向GCM / FPNS发出HTTP请求时,我们应该根据浏览器类型向GCM / FPNS发送注册ID和请求(如果用户注册ID属于Chrome,我们将发出GCM请求,否则FPNS请求)。例如,如果我们有10,000条记录,我们应该向FPNS / GCM提出大约10,000个请求。
GCM / FPNS收到用户注册ID后,会向浏览器发送推送通知。在浏览器中,我们有JavaScript代码(Service Worker)来处理通知事件。
对于上述要求,同步servlet架构不够好。因为要处理10,000条记录,即使我们使用多线程,也可能需要10到15分钟。它可能导致tomcat内存泄漏和内存不足异常。
当我在网上搜索时,人们建议使用异步servlet架构。一旦我们从客户端请求发送通知,我们将立即响应(类似200 Ok Added to queue
),并且此请求也应添加到Message Queue(JMS)。从JMS我们使用多线程来发出异步HTTP请求。
我找不到正确的方法。您能否提出一种实现此功能的方法(架构设计和控制流程)?
答案 0 :(得分:0)
如果没有更改为PubNub之类的内容,我会创建一个工作队列。这可以使用JMS或仅使用共享队列(搜索生产者/消费者)来完成。在我看来,JMS是最简单的,尽管在集群中分发更加困难。
基本上你可以继续使用同步servlet - 它会接收消息,将它放在队列中,然后返回200.在队列上放置一条消息将具有非常小的阻塞 - 最多只需几毫秒。 / p>
正如您所指出的,在队列消费者方面,您必须处理许多请求。根据系统的延迟要求,您可能需要对其进行线程化或卸载。这实际上取决于您发送消息的速度。
对于完全不同的架构,您可以考虑“云中的队列”。我已经使用Amazon SQS来做这样的事情了。你甚至不会有一个servlet - 消息将直接发送到SQS,然后其他东西会把它拉下并处理它。
供参考,我不适用于亚马逊或PubNub。