只是想以第一人称视角加入进来,因为我们每天都会发送数百万条 APNS 通知。
不幸的是,@Eran 引用的参考资料是关于 Apple 如何管理 APNS 套接字的最佳资源。对于小批量来说这很好,但 Apple 的文档总体上非常偏向于休闲、小批量的开发人员。一旦扩大规模,您将看到大量未记录的行为。
该文档中关于异步进行错误检测的部分对于高吞吐量至关重要。如果您坚持在每次发送时阻止错误,那么您将需要高度并行化您的工作人员以保持吞吐量。然而,推荐的方法是尽可能快地发送,并且无论何时出现错误:修复和重播。
我反对的那篇文章的一部分是:
如果您正确捕获了设备令牌并将它们发送到正确的环境,那么设备令牌应该几乎都是有效的。因此,假设故障很少见,进行优化是有意义的。
用如此巨大的“如果”来预测该建议似乎具有极大的误导性。我几乎可以保证,大多数开发人员都没有 100%“正确”地获取令牌并处理 Apple 的反馈服务。即使它们是,系统本质上是有损的,所以漂移会发生。
我们看到非零数量的错误 #8 响应(无效的设备令牌),我将其归因于有根电话、客户端错误或用户故意将其令牌欺骗给我们。过去我们还看到了一些错误 #7(无效的有效负载大小),我们将其追踪到开发人员在我们端添加的编码不正确的消息。这当然是我们的错,但这是我的观点——说“优化假设失败将是罕见的”是发送给学习开发人员的错误信息。我要说的是:
假设会发生错误。
希望它们不经常发生,但要防御性地编码以防万一。
如果您在假设错误很少见的情况下进行优化,那么每当 APNS 服务出现故障并且您发送的每条消息都返回错误 #10 时,您可能会将基础架构置于风险之中。
当试图弄清楚如何正确响应错误时,麻烦就来了。关于如何正确处理和从不同错误中恢复的文档不明确或不存在。这显然是留给读者的练习。