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

时间:2015-03-25 14:07:07

标签: java multithreading google-app-engine concurrency twilio

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

  1. 每分钟发送600条短信
  2. 零错过
  3. 省钱
  4. 现在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 个答案:

答案 0 :(得分:2)

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

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