了解如何存储Web推送端点
我试图在我的一个应用程序中开始实现Web推送。 在我发现的例子中,客户的端点URL通常存储在内存中,其注释如下所示:
在生产中,您可以将其存储在数据库中...
由于只有我的应用程序的注册用户才能/会得到推送通知,我的计划是将终端URL存储在我的数据库中的用户元数据中。 到现在为止还挺好。
问题出现在我想让同一用户在多个设备上接收通知时出现。 从理论上讲,我只会为用户订阅的每个设备添加一个新的端点到数据库。 但是,在测试中,我注意到终端会随着每个订阅/取消订阅而改变。 因此,如果用户在同一台设备上连续多次订阅/取消订阅,我最终会为该用户保存多个端点(除了其中一个端点以外都是坏的)。
从我读到的内容来看,当用户取消订阅或端点失效时,没有可靠的通知方式。 那么,如何在添加新终端前删除旧终端?
什么是阻止用户通过重复订阅/取消订阅填充我的数据库端点来有效地进行拒绝服务攻击?
这更像是一个笑话(我可以明显限制给定用户的总终点),但是我看到的问题是,当发送通知的时候,我会通知无数端点的通知服务。
我希望我的服务器上的订阅逻辑是:
问题是,我不知道如何可靠地做#1。
我只会为用户订阅的每个设备添加一个新的端点到数据库
最好的方法是制作这样的表格:
endpoint | user_id
endpoint
上添加一个唯一约束(或主键):您不希望将同一个浏览器关联到多个用户,因为它是一团糟(如果端点已经存在但它具有不同的user_id
,只需更新user_id
与之相关) user_id
是指向用户表的外键 如果用户在同一台设备上连续多次订阅/取消订阅,我会为该用户保存几个端点(除了其中一个端点外)。
是的,不幸的是,推送API有一个狂放的取消订阅机制,你必须处理它。
端点可能过期或可能无效(甚至可能是恶意的,如android.chromlum.info
)。 当您尝试从您的应用程序服务器发送推送消息时,您需要检测失败(使用HTTP状态码,超时等)。 然后,对于某些类型的故障(永久故障,例如到期),您需要删除端点。
什么是阻止用户通过重复订阅/取消订阅填充我的数据库端点来有效地进行拒绝服务攻击?
正如我上面所描述的,一旦您意识到它们已过期或无效,您需要正确删除无效端点。 基本上他们会产生至多一个无效的请求。 而且,如果您的吞吐量很高,服务器只需几秒钟就可以请求数千个端点。
我的建议是基于我在开发Pushpad时完成的大量实验和思考。
链接地址: http://www.djcxy.com/p/40257.html上一篇: Understanding How to Store Web Push Endpoints
下一篇: Android Studio External Native Build Precompiled Headers