我有一个Android应用程序,其后端是nodejs sails服务器。我在服务器上安装了GCM推送通知服务,我可以使用
向我的应用程序的用户发送推送通知curl http://localhost:1337/notification/1000
其中例如1000是要向其发送通知的用户的用户ID。
基本上,它的工作原理是此CLI将使用用户的userID作为URL参数调用URL /notification
。 /notification
URL上定义的函数从数据库中提取此userID的GCM注册ID,并在该注册ID上向该用户发送通知,并在函数内定义消息内容和类型。
这种方法非常有效。但现在我想批量执行此操作,以便向所有用户发送通知。为此,我编写了一个python脚本
import MySQLdb
from MySQLdb.cursors import DictCursor
import os
import sys
import time
from datetime import datetime
#initiating the db
db = MySQLdb.connect(host = 'db_host', user = 'db_user_name', passwd = 'db_pass', db = 'db_schema_name')
queryCursor = db.cursor()
#finding users for whome recommendations are available
potentialUserDeterminationQuery = "select id from user"
queryCursor.execute(potentialUserDeterminationQuery)
availablePool = list(queryCursor.fetchall())
for elements in availablePool:
userID = int(elements[0])
os.system("curl http://localhost:1337/notification/" + str(userID))
queryCursor.close()
db.close()
我的问题:当我使用此方法发送批量通知时,通知会发送给许多用户,但也不会发送给很多用户。当通知无法发送给用户时,我收到以下服务器响应:
connection refused on port 1337
我的解决方法:
(1)我想出服务器可能无法以此速度处理通知请求。所以我在使用time.sleep(0.02)
发送每个通知后引入了20毫秒的延迟,并再次运行了脚本。但是再次发生的是,由于这个错误,很少有用户没有收到通知,而其他人则得到了。
(2)如果数据库没有正确存储GCM注册ID,则问题可能出在userID,因此服务器无法接受请求。所以我尝试通过CLI向该用户发送单独的推送通知,并且它有效。用户通过CLI单独发送时收到通知。
(3)这可能是批量通知脚本的周期性问题。因此,我在脚本循环中替换了userID,从userID = int(elements[0])
到userID = bugID
bugID是在批量消息传递过程中未向其发送通知的其中一个用户的用户ID。所以本质上我在一个用户上模拟了所有用户的批量消息。在此测试中,所有消息都传递给该用户,没有任何服务器连接拒绝错误。
除了这三种方法之外,还有什么可行的解决方法,以便我可以检测到问题并修复系统,然后将通知发送给所有人。