我正在考虑可能的方法来快速解决我在这里称为“连接调度”的问题......这就是事情。
我有几台(几十台)服务器可以接受有限数量的客户端。另一方面,我有许多(数千个)客户端试图连接到其中一个服务器上的“空闲插槽”。这些会话的持续时间是有限的,因此如果连接的客户端没有主动断开连接,一段时间后,它将被强制踢出。以下情况成立:
- 服务器可以报告客户端连接/断开连接事件
- 如前所述,过期的客户端会话被强制终止
我想这样做:
创建一个双面(REST)Web 服务。一侧将接受来自服务器的有关客户端连接/断开连接的通知,而另一侧将由客户端自己使用,查询空闲槽/空闲服务器。我以为我会有一个数据库表,其中每一行代表一个服务器及其状态,它可能类似于:
编号 | server_ip | 请求 | 连接 | 最大允许 -------------------------------------------------- ------------ 1 | 30.9.50.150 | 5 | 80 | 200 2 | 30.9.50.151 | 15 | 130 | 200
我显然需要的是一种一致(同步)的方式来在此服务的两侧执行 SELECTs/UPDATEs,因为通知和客户端查询可能同时发生。我将给出一个可能的(伪)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 锁定模式和东西的内容(例如这里),但我不太能够决定在这种情况下我需要什么,以保持每个服务器的一致数据(表行)。有人可以就适当的锁定模式/事务布局提出建议吗?