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

标签 java multithreading google-app-engine concurrency twilio

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

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

现在 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 的。

最佳答案

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

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

关于java - 如何在 Java App Engine 中实现原子整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29258003/

相关文章:

java - 使用管道符号作为分隔符拆分字符串

java - 我必须使用 thread.interrupted() 吗?

java - Google App Engine的自定义异常(exception)消息格式-Java

google-app-engine - 如何使用 AppEngine 和 Datastore 生成大文件(PDF 和 CSV)?

google-app-engine - 如何使用 Go 将 key 存储在数据存储对象中?

java - 解析从网站 Api 提取的 Json 代码中的数据时出现黑屏输出

java - 骑士的最短路径(BFS)

java - JButton 隐藏直到悬停第一次启动

java - Spring Controller 是线程安全的吗?

具有意外 cpu 消耗的 C 多线程进程