在我们公司,我们有一个分布在少数实例中的服务器。服务器处理用户请求。可以并行处理来自不同用户的请求。应该强烈地按顺序执行来自同一用户的请求。但由于平衡,他们可以到达不同的实例。目前我们使用基于Redis的分布式锁,但这很容易出错,需要更多的关于并发性的工作,而不是业务逻辑。大量的单线程任务队列
我想是这样的(更像是一个概念):
- 为每个用户
- 队列用户ID命名的鲜明队列
- 通过请求ID标识的每个请求
想象一下,来自同一用户的两个请求同时到达两个不同的实例:
- 每个实例将其请求标识放入此用户队列中。
- 另外,它们都在本地存储它们的请求ID。
- 那么一些券商采取从“some_user_queue”顶部请求ID,并将其移动到“some_user_queue_processing”
- 两个实例监听“some_user_queue_processing”。他们偷看它,看看这是否是他们本地存储的请求ID。如果是,那么请处理。如果不是,那么忽略并等待。
- 工作完成后,服务器将此ID从“some_user_queue_processing”中删除。
- 然后再次执行步骤3。
而这一切对于很多同时发生(几千条)不同的用户(以及他们的队列)的。
现在,我知道这听起来很像的演员,但:
- 我们需要的解决方案需要的微小变化可能使从锁的快速转换。阿卡会迫使我们从头开始重写几乎所有的东西。
- 我们需要生产准备解决方案。类星体听起来不错,但尚未准备好生产(更准确地说,它们的Galaxy系列)。
- 我工作的顶部非常保守,他们根本不想要我们需要支持的另一个依赖。但是我们已经使用Redis(用于分布式锁),所以我想也许它可以帮助解决这个问题。
感谢
也许您可以评估Hazelcas对分布式锁的支持,请参阅http://hazelcast.org/#lock。 –
假设粘性会话,它的简单写一个[dispatch queue](http://stackoverflow.com/questions/29889885/java-divide-incoming-work-uniformly-via-hashing-in-multithreaded-evnironments/29893297#29893297 )在Java 8中。 –
你能告诉我,如果我的答案是你实际需要的吗? –