向 Http GCM 服务器发送帖子时的响应时间非常长

Posted

技术标签:

【中文标题】向 Http GCM 服务器发送帖子时的响应时间非常长【英文标题】:Response time when sending post to Http GCM server is very high 【发布时间】:2016-10-07 17:23:36 【问题描述】:

我正在开发一个应用服务器来发送 GCM 消息。我的应用程序服务器正在使用 HTTP 协议向 GCM 连接服务器发送 post 请求。请求的平均响应时间是可以接受的(大约 100 毫秒),但有时我收到的响应时间大于 1 秒。更多时候,我的响应时间为 2、4 秒甚至更长。 我正在使用这个库gcm-server 将我的请求发送到 GCM 服务器。我相信它归谷歌所有。 为了解决这个问题,我在 gcm-server 库代码中进行了一些分析,但找不到任何线索或答案。最终,我决定将一些带有有效帖子的 curl 发送到 GCM 服务器。结果是一样的。我确定这不是预期的行为,也许我做错了什么,但无法找到或理解它是什么。

下面是我正在运行的脚本来测试它。我正在向 GCM 发送 1000 个 post 请求,没有任何 Keep-Alive 定义(默认情况下 cURL 使用 Keep-Alive 启用)。

#!/bin/bash

for i in 1..1000; do

    curl -s -w "%http_code - %time_total\n" -o /dev/null -X POST -H "Content-Type: application/json" -H "Authorization: key=putHereOneGCMValidToken" -H "Cache-Control: no-cache" -d '
      "collapse_key": "92667ba1-c8e9-4018-bf14-156417065641",
      "delay_while_idle": false,
      "data": 
        "field1": "value1",
        "field2": "value2"
      ,
      "time_to_live": 0,
      "registration_ids": [
        "REGISTRATION_ID_1",
        "REGISTRATION_ID_2",
        "BAD_REGISTRATION_ID"
      ]
    ' "https://gcm-http.googleapis.com/gcm/send";
    sleep 0.2;

done

参考:

GCM http server documentation

【问题讨论】:

【参考方案1】:

您的服务器排队的下游消息过多。尝试使用较低的测试编号发送。如果您正在测试或发送到多个设备或用户,请尝试Device Group Messaging 或Send Messages to Topics。

设备组消息传递

借助设备群组消息传递,应用服务器可以将一条消息发送到在属于某个群组的设备上运行的应用的多个实例。

向主题发送消息

GCM 主题消息传递允许您的应用服务器向已选择加入特定主题的多台设备发送消息。

此外,您还必须考虑诸如间歇性互联网连接等外部因素导致接收消息延迟。最后你可能想查看这个相关的SO question 发送 GCM 后体验 High Server CPU。

希望这会有所帮助!

【讨论】:

在我的应用服务器中,我已经对消息进行了分组,我正在向多个registrationIds发送一个请求;甚至测试脚本也有多个registrationId,以使场景更接近我的现实。该测试的建议是获取样本以帮助我了解我面临的问题。在我的应用程序服务器中,我不会按顺序发送 1000 个请求,这是肯定的;我正在向 GCM 发送大量请求,但它们不是按顺序发送的,有时我会得到一些较长的响应时间,就像我之前报告的那样。无论如何感谢您的回答。 我已将测试脚本更改为仅发送 10 个请求并在每 10 个请求运行之间休眠 2 秒。在仅 5 次运行中,我得到了 3.074 和 1.347 的响应。

以上是关于向 Http GCM 服务器发送帖子时的响应时间非常长的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1,向用户返回响应,然后执行一些代码 [关闭]

从 vuejs 客户端向 oauth/token 发送 POST 请求时的 401 响应

使用 GCM 的 Android 聊天应用程序如何工作?

在哪个事件中,我可以使用 PushSharp 获取 GCM 响应以向 Android 设备发送通知?

GCM 如何在推送通知中识别设备?

GCM 使用 content_available 向 iOS 推送通知(无法从非活动状态调用)