首页 文章

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

提问于
浏览
0

我正在尝试为我的应用推出自己的短信验证系统 . 我不想开始为一项服务付费,然后让他们抬高价格(Urban Airship为我做了推送通知:吸取了教训) . 在开发和beta测试期间,我一直在使用Twilio的基本设置:1个电话号码 . 它运作良好超过一年,但现在无论出于何种原因,消息并不总是传递 . 无论如何,我需要创建一个更好的 生产环境 系统 . 所以我有以下规格:

每分钟

  • 600发送短信

  • 零失误

  • 省钱

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

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

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 ,以便每个电话号码都被周期性地调用?同样,这适用于Google App Engine .

1 回答

  • 2

    你需要使用Task API . 每条消息都是一项新任务,您可以使用循环或随机分配来分配电话号码 . 任务完成后,App Engine将自动拉取并执行下一个任务 . 您可以配置所需的吞吐率(例如,每秒10个),App Engine将为您管理所需的容量 .

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

相关问题