繁体   English   中英

Web服务队列设计,带有数据库

[英]web-service queue design, with a DB

我正在尝试设计一个允许将注册用户添加到队列中的移动应用程序。 向网络服务请求一个号码,然后以存储的号码进行响应。 下一个发出请求的用户将获得连续编号。

我正在使用C#作为服务器端语言,并将mySQL用于users数据库。

客户端发送HTTP POST请求,其中“身份验证”标头为“ username:password”,“ x-action”自定义标头为“ joinQueue”。 并将他的号码排队。 稍后,他可以使用“ checkQueueStatus”操作来轮询Web服务,以查看他现在在队列中的位置。

服务器端执行以下操作:

  1. 访问用户数据库并检查username:password是否存在(正确)。
  2. 发送last_number + 1并更新HTTP响应正文。
  3. 将用户ID 123123为31的信息存储在队列中。
  4. 入队完成后,将为所有用户更新队列。

作为Web服务的新手,我不太确定如何设计服务器端部分。 具体来说,使用以下信息创建另一个表(队列表)是否有意义:

userID  | placeInQueue 
301452        1 
444592        2 
612712        3
042125        4

并且管理员客户端现在可以通过“ serviceFirstUser”操作发送HTTP请求,这将减少队列中每个人的placeInQueue?

这是合理的设计吗?

谢谢。

使用QueueTable是一个好主意,但是您不需要这样做:

  • 入队完成后,将为所有用户更新队列。

您可以只索引placeInQueue,然后获取max_place-min_place

CREATE TABLE IF NOT EXISTS `queue`
(
    `userID` INT(9) PRIMARY KEY NOT NULL,
    `placeInQueue` BIGINT(16) AUTO_INCREMENT NOT NULL,
    INDEX(placeInQueue)
) ENGINE=MyISAM;

因此,您只是获得第一个用户在队列中的位置(以恒定的复杂度):

SELECT * FROM `queue` ORDER BY `placeInQueue` ASC LIMIT 1

然后,您可以以对数复杂度获得用户的位置:

SELECT * FROM `queue` WHERE `userID`='<user_id>' LIMIT 1

他的实际位置是(他的placeInQueue)-(第一个的placeInQueue)+1。

然后,您不需要进行线性更新...删除第一个可以以对数复杂度完成(对于placeInQueue索引是常数,对于userID是对数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM