异步服务器,在等待回调时处理断开连接

时间:2012-06-22 11:46:32

标签: sql c asynchronous tcp unix-socket

根据异步服务器管理我有一个问题。我正在使用 libevent2 和(对于我自己的学习经历)普通的ANSI C. 我用apache2 utils做ab压力测试。主要是-n 10000-c 400。 我的数据库是我本地网络中debian计算机上的sql server。所以连接速度非常快。 我也用valgrind(--leak-check=full --show-reachable=yes

描述我的应用程序

我现在有一个问题。 当我对sql数据库进行同步调用时,一切正常。但这一切都是在主线程上完成的,因此新客户端需要一些时间来接收数据(压力在运行时)。 当我对sql数据库执行异步调用时,一切正常,只要在sql调用返回之前没有客户端断开连接。一旦sql调用返回并且客户端已经断开连接,我就会得到很多无效的读错误(当然),因为它的缓冲区已经被释放,套接字已经关闭等等。我已经尝试了很多不同的东西但是却没有得到一个合适的解决方案。

我只想问你如何处理这样的事情?例如,您是否保留了BST,其中包括所有连接的客户端以及当异步调用返回时您在其中搜索它?如果它还在那里你执行回调否则丢弃它?我认为这可能会扼杀性能。 我还试图检查插座是否仍然打开,但它有点奇怪。 recv(fd, buffer, 1, MSG_PEEK)始终returned -1(在打开和关闭的非阻塞套接字上)..

嗯,有点难以解释我已经做了什么,所以我只是等待你们会回答的问题: - )

问候 马库斯

更新: 我只是疯狂的想法为每个连接使用互斥锁。当我进入异步调用我锁定它,并在它返回后释放.. :-)但我不相信这种方法..它听起来不对..任何人都可以推荐这种方法吗?

更新2:我尝试了我的想法并且效果很好。做到这一点有点棘手,但锁定做到了

1 个答案:

答案 0 :(得分:0)

每个连接的锁定工作正常,但它有一些缺点:

  • 每个连接的收益是一个未完成的请求。这限制了您的应用程序可以扩展的程度。

  • 在扩展连接数时,应用程序必须创建的互斥锁数量也是一个问题。

最好的办法是将“连接和客户端请求管理”与“SQL查询管理”分离,就像您提到的那样。这要求您将响应与请求进行匹配。随着您的规模上升以服务数十万个请求,查找的成本将是微不足道的。还有一些方法可以优化它(例如,两级查找,首先是客户端,然后是来自该客户端的请求)。对于客户端查找,您可以为每个客户端分配ID并实施快速搜索操作。