Web服务队列设计,带有DB

时间:2013-01-05 13:35:36

标签: c# web-services database-design

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

我使用C#作为服务器端语言,使用mySQL作为用户数据库。

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

服务器端执行以下操作:

  1. 访问用户数据库并检查用户名:密码是否存在(正确)。
  2. 发送last_number + 1并更新HTTP响应正文。
  3. 存储信息,例如,用户ID 123123在队列中为31。
  4. 在完成第一个队列服务后,为所有用户更新队列。
  5. 作为网络服务的菜鸟,我不太清楚如何设计服务器端部分。 具体来说,使用以下信息创建不同的表,队列表是否有意义:

    userID  | placeInQueue 
    301452        1 
    444592        2 
    612712        3
    042125        4
    

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

    这是一个看似合理的设计吗?

    感谢。

1 个答案:

答案 0 :(得分:0)

使用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的一个对数)。