为了减少每秒的请求数,如何将多个并发(POST)请求安全地合并到一个批量请求中?
// for instance, does a thread-unsafe batched POST risk data loss/dupes?
val data = scala.collection.mutable.Queue[String]()
// simple kafka-client reading from multiple partitions
kafkaConsumerIter.foreach { concurrentIncomingData =>
data.enqueue(s"request data: $concurrentIncomingData")
if (data.length % 1000 == 0) {
val postData = data.dequeueAll(_ => true).mkString
...post a batch of roughly ~1000 in a single request...
}
}
这种批处理方法可以实现每秒减少请求数,同时保持队列大小合理地低于其规模(预计根本不会增长),但这种方法是否存在数据丢失或重复的风险?
使用java.util.concurrent.ConcurrentLinkedQueue
的实施会更安全吗?如果是这样,dequeue
整个(全部)ConcurrentLinkedQueue最安全的方法是什么?