我正在考虑可能的方法来快速解决我在这里称为“连接调度”的问题......这就是问题所在。
我有几个(几十个)服务器可以接受有限数量的客户端。另一方面,我有很多(数千个)客户端尝试连接到其中一个服务器上的“空闲插槽”。这些会话的持续时间有限,因此如果连接的客户端没有自愿断开连接,经过一段时间后,它将被强行踢出。以下是正确的:
我想这样做:
创建一个双面(REST)Web服务。一方将接受来自服务器的关于客户端连接/断开连接的通知,而另一方将由客户端自己使用,查询空闲插槽/免费服务器。我以为我有一个数据库表,每行代表一个服务器及其状态,它可能类似于:
id | server_ip | requests | connections | max_allowed ------------------------------------------------------------- 1 | 30.9.50.150 | 5 | 80 | 200 2 | 30.9.50.151 | 15 | 130 | 200
我显然需要的是在此服务的两端执行SELECT / UPDATE的一致(同步)方式,因为通知和客户端查询可能同时发生。我将举例说明可能的(伪)SQL查询,即事务:
服务器通知方:
SELECT requests as curr_reqs, connections as curr_conns
FROM server WHERE id = server_id;
-- if client-connect occurred:
UPDATE server SET connections = (curr_conns + 1), requests = (curr_reqs - 1)
WHERE id = server_id;
-- if client-disconnect occurred:
UPDATE server SET connections = (curr_conns - 1)
WHERE id = server_id;
客户端查询方:
SELECT id as free_id, requests as curr_reqs, server_ip as free_ip FROM server
WHERE connections < (0.6 * max_allowed) AND
requests < max_allowed
ORDER BY requests DESC;
-- if a free record is obtained:
UPDATE server SET requests = (curr_reqs + 1)
WHERE id = free_id;
。
所以,我读了一些关于MySQL锁定模式和东西的内容(例如here),但是我无法确定在这种情况下我需要什么,以保持每台服务器的一致数据(表格行) 。有人可以就适当的锁定模式/交易布局提出建议吗?