使用FCM向所有订阅主题的设备发送推送通知(批量)时出现缩放问题

时间:2018-09-09 11:00:11

标签: android push-notification firebase-cloud-messaging load-balancing

我已为所有设备订阅了一个主题,即大约100万用户。在设备中收到通知后,会有一个操作按钮,该按钮调用REST API。

现在,如果我向订阅该特定主题的所有设备触发通知,则所有用户都会收到该通知,然后点击操作按钮,该按钮将调用其余API来获取数据。

过多的剩余API调用将CPU利用率提高到100%,并且我的服务器停止响应。

有什么方法可以使FCM向批处理中订阅该主题的所有设备发送通知,以便我的服务器可以处理负载

1 个答案:

答案 0 :(得分:1)

  

如果无法批量发送主题通知,则以下解决方法是解决方法。

1。延迟在应用程序一侧显示通知的时间。

在应用程序上收到通知后,您可以决定何时向用户显示通知。以这样的方式编写逻辑,例如,某些用户将在收到通知后立即看到通知,有些用户将在2分钟后看到通知,有些用户将在4分钟后看到通知,依此类推。

您可以使用AlarmManagerHandler或类似的东西。

2。创建主题桶

假设您的主题为sport_news。将主要主题sport_news分为sport_news_1sport_news_2sport_news_3,依此类推。实施自己的逻辑来划分用户。

例如

在第一天注册的

用户将属于sport_news_1

在第二天注册的

用户将属于sport_news_2

以此类推。

因此,每当您必须将通知发送到主题sport_news时,您都将向所有属于该主题的主题发送通知,在我们的情况下,它将是sport_news_1sport_news_2等上。您可以按一定的时间间隔发送它以处理批处理,因为您具有服务器端控件来按批发送。

3。将服务器扩展一定的间隔以处理大量流量。

在将通知发送给数百万用户并知道您将获得高流量后,请在一定时间内扩展服务器以处理大量流量(例如1-2小时)。

4。改善获取数据API的延迟时间

知道对特定的提取数据api会收到太多请求,因此可以在内存数据存储中实现缓存,数据库索引或其他任何方式来加快提取操作。您只需要找到一种以某种方式减少fetch api响应时间的方法,您的服务器将以此方式处理大量流量,并且CPU利用率可能会降低。