【发布时间】:2016-09-16 21:56:23
【问题描述】:
我正在通过 Google Cloud Messaging 和 Firefox Push Notification System 实现浏览器推送通知的发送。为此,我们必须向 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),并且此请求应添加到消息队列(JMS)中。在 JMS 中,我们使用多线程来发出异步 HTTP 请求。
我没有找到正确的方法。您能否建议一种实现此功能的方法(架构设计和控制流)?
【问题讨论】:
标签: java multithreading servlets concurrency java.util.concurrent