【问题标题】:Architecture of Java Servlet Browser push notificationJava Servlet 浏览器推送通知的架构
【发布时间】: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


    【解决方案1】:

    没有更改为 PubNub 之类的内容,我将创建一个工作队列。这可以使用 JMS 或仅使用共享队列(搜索生产者/消费者)来完成。在我看来,JMS 将是最简单的,尽管它更难在集群中分发。

    基本上,您可以继续使用同步 servlet - 它会接收消息,将其放入队列,然后返回 200。将消息放入队列中的阻塞非常小 - 最多只有几毫秒。

    正如您所指出的,在队列消费者方面,您将不得不处理许多请求。根据系统的延迟要求,您可能需要线程化或卸载它。这实际上取决于您需要多快发送消息。

    对于完全不同的架构,您可以考虑“云端队列”。我用Amazon SQS 来处理这样的事情。你甚至不会有一个 servlet - 消息会直接发送到 SQS,然后其他东西会将其拉出并处理它。

    作为参考,我不为亚马逊或 PubNub 工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多