如何在 Java App Engine 中实现原子整数?

How to implement an atomic integer in Java App Engine?

我正在尝试为我的应用推出我自己的短信验证系统。我不想开始为一项服务付费,然后让他们抬高我的价格(Urban Airship 对我这样做是为了推送通知:经验教训)。在开发和 Beta 测试期间,我一直在使用具有非常基本设置的 Twilio:1 phone 数字。它在一年多的时间里运行良好,但现在无论出于何种原因,消息并不总能送达。无论如何,我需要创建一个更好的生产系统。所以我考虑了以下规格:

  1. 每分钟发送 600 条短信
  2. 零失误
  3. 省钱

现在my Twilio phone number can send one SMS per second;这意味着我能处理的最好情况是每分钟 60 个快乐的用户。那么如何每分钟获得 600 个满意的用户?

所以显而易见的解决方案是使用 10 phone 个号码。但是我将如何实施该系统?我的服务器是 App Engine,DataStore,Java。假设我从 Twilio 购买了 10 phone 个号码(当然越少越好)。我如何实现数组以便它可以处理来自用户的并发调用?以下是否足够?

public static final String[] phoneBank = {“1234567890”,”2345678901”,”3456789012”,”4567890123”,…}; 
public static volatile nextIndex;

public void sendSMSUsingTwilio(String message, String userPhone){
  nextIndex = (nextIndex+1)%phoneBank.length;
  String toPhone = phoneBank[nextIndex];

  // boilerplate for sending sms with twilio goes here
  //…
}

现在假设有 1000 个用户同时调用这个函数。 nextIndex 运行 会不会从 0,1,2…9,0,1…9,0,… 连续发送直到所有请求都发送完?

所以这确实是一个并发问题。此并发问题将如何在 Java AppEngine 上发挥作用?会有交错吗?瓶颈?我希望它在低预算下快速:每分钟至少 600 个。所以我绝对不希望代码本身的同步浪费宝贵的时间。那么我如何最好地同步调用以增加 nextIndex 以便每个 phone 数字都以周期性的方式被平等地调用?同样,这是针对 Google App Engine。

您需要使用 Task API。每条消息都是一项新任务,您可以使用循环法或随机分配法分配 phone 个数字。当一个任务完成时,App Engine 会自动拉取并执行下一个任务。您可以配置所需的吞吐率(例如,每秒 10 个),App Engine 将为您管理所需的容量。

您可以尝试自己实现类似的东西,但这比您想象的要困难得多 - 您必须处理并发、重试、实例关闭、内存限制等。Task API 完成了所有这些给你的。