使用MySQL的“连接调度程序” - 行级锁定建议?

时间:2013-09-10 13:50:00

标签: mysql sql transactions locking row

我正在考虑可能的方法来快速解决我在这里称为“连接调度”的问题......这就是问题所在。

我有几个(几十个)服务器可以接受有限数量的客户端。另一方面,我有很多(数千个)客户端尝试连接到其中一个服务器上的“空闲插槽”。这些会话的持续时间有限,因此如果连接的客户端没有自愿断开连接,经过一段时间后,它将被强行踢出。以下是正确的:

  • 服务器可以报告客户端连接/断开事件
  • 如上所述,过期的客户端会话被强行终止

我想这样做:
创建一个双面(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),但是我无法确定在这种情况下我需要什么,以保持每台服务器的一致数据(表格行) 。有人可以就适当的锁定模式/交易布局提出建议吗?

0 个答案:

没有答案