2017-06-12 48 views
0

请问我的春节休息控制器通过@Autowired@Service类使用@Service类有一个关键部分 - 在一个实例字段话题 - 安全分布式弹簧安置服务

private final Object modifyIndexLock = new Object();做好准备分布式部署同步,或者我需要同步在其他方面呢?

基础资源是Lucene索引编写器,在任何时间点,只能打开一个编写器。试图在已经打开作者的情况下尝试打开作家的线程将失败。我不希望我的线程失败,但等待。

代码适用于单个服务器应用程序部署,但我想它在分布式环境中会失败,因为在每个JVM中会有多个@Service实例导致不同的锁,而底层受保护的资源是单一的。

synchronized(modifyIndexLock){ 
//Open & use writer the close 
} 

一个作家池不可用,但只有一个实例。

IndexWriter

回答

1

如果你有一个分布式应用程序,那么每个实例使用其自己的锁,绝对不会保证共享资源的独占访问。您需要使用分布式锁(例如使用Zookeeper),或者也可以使用关系数据库来提供所需的锁。 参见例如:https://www.xaprb.com/blog/2006/07/26/how-to-coordinate-distributed-work-with-mysqls-get_lock/

+0

感谢您提供关于使用DB锁定和zookeeper的想法。它的推荐[这里](https://stackoverflow.com/questions/1059580/distributed-lock-service)。目前,我正考虑在DB上留下一个标志,因为这似乎是更简单的解决方案。 –