多个线程尝试同时在同一个No-Sql数据存储上写入

时间:2018-06-11 18:09:30

标签: database multithreading concurrency nosql java.util.concurrent

我们公司有一个内部的no-sql数据存储区。我提供键值存储。值为JSON格式。我将其称为XYZ DataStore。

问题陈述:

我有一个应用程序,一次产生10-15个线程。每个线程负责同时写入同一个XYZ。虽然记录是PUT,但是不同,(意思是不同的Key)。创建的XYZ Rest Client是singleton,这意味着所有线程都使用一个单独的客户端。 (我使用spring bean创建singleton客户端)。

观察:只有一个线程能够将记录放入XYZ中。其他线程根本无法写入黑貂,即使在延迟时间之后也是如此。

如何处理XYZ的并发写入?什么是首选方式?

我可以通过以下方式实现:

  • 在我的端子上实现PUT API的锁定,即使是并发的 线程试图用单个线程写,应该是 能够等到锁被释放。

    • 我不确定如何实现这一点。如果有人有指针,那就太好了。
  • 以上就像生产者线程一样。我可以创建一个消费者线程。生产者线程会写这个记录放在一个 队列和消费者线程将逐个读取它 更新它。

    • 在这里,我将使用java.util.concorrent。 BlockingQueue读取和写入队列,供消费者和生产者线程使用。这是正确的方法吗?

有谁能建议我哪种方式最好?

BTW,应用程序是用Java构建的,使用spring框架。

TIA

1 个答案:

答案 0 :(得分:0)

即使是singleton也确保你不会在线程之间共享任何东西,并且该类中的每个方法都是单独的,然后你可以很好地将其设置为单例并且不要担心阻塞因为它将成为方法调用所以每个线程将简单地调用该方法。而已。在这里,您知道每个事务是否失败都基于方法响应,因此您可以根据该事务确定事务是成功还是稍后重新启动它。不需要延迟。

在排队系统中,您可以在并发包中更好地考虑DeQueue。看一些例子并实现它。这也很有效但是在这里你要跨多个线程共享队列。你不会觉得这种缓慢但分享在这里发生。这里没有为推送值传递这样的事务。我们只有在成功之后才能做到这一点,我们可以将价值出列,否则只需单独看。如果继续失败,请移至单独的队列以供以后使用。这是对我们的另一个赦免。不需要延迟。