套接字,轮询,无套接字结果?

Posted

技术标签:

【中文标题】套接字,轮询,无套接字结果?【英文标题】:Sockets,Polling, socket-less results? 【发布时间】:2014-08-22 23:23:00 【问题描述】:

我正在开发一个 Windows 窗体应用程序,该应用程序在 Microsoft Azure 开发服务托管的云 SQL 服务上运行。没有能力实际拥有一个接收应用程序,这将允许我利用套接字,这是一个基本的陷阱,因为我的应用程序将严重依赖专用数据库,所以我希望能够不断检查数据库的变化和根据符合条件的行条目提醒当前用户。

我在一些博客/帖子中读到轮询(可能的解决方案)是一件坏事。那么,要考虑的方法是什么?

【问题讨论】:

轮询绝对是个坏主意。套接字到底有什么问题? WCF 是一个不错的选择(但它也使用套接字...) @BradleyDotNET Azure 有一个 MSSQL 托管服务,所以安装/配置套接字看起来是不可能的 我现在明白了,您需要来自数据库的实时提要,最好的情况是仍然在某个服务级别进行轮询。艰难的召唤,真的。如果您可以在服务器上托管一个标准的 WCF 服务,该服务保留数据库的内存副本(并且只使用数据库进行恢复),那将会容易得多。 @BradleyDotNET 实际上,Azure 确实提供了托管虚拟机的能力。配置带有 Socket 接收器和 MSSQL 数据库的 Windows Server 机器的时间和超额成本有点捉襟见肘。设置这个会是一个更好的选择吗?或者您会说使用云 SQL 服务有什么可能? 很难说。我会使用该服务只是因为让 10K 客户不断查询数据库听起来像一个真的坏主意。有关更多信息,请参阅我的答案。 【参考方案1】:

为了澄清问题,您希望客户端在数据库中某些数据发生更改时接收更新。

SQL Server 2005 和 2008 确实支持在数据更改时通知客户端的概念 (MSDN)。但是,this SO 问题似乎表明此功能目前在 SQL azure 中不存在。这意味着您有几个选择:

    轮询数据库本身

    此选项可让您降低成本,因为您已经拥有所需的一切。当然,缺点是您以相对频繁的间隔进行(可能很大)查询。如果有足够多的客户端,由于涉及的负载,这将大大减慢。如果您有价格/转让方案,这也可能证明成本很高。

    围绕数据库包装一个服务并与之对话

    这可以与轮询一起使用,但在使用推送技术(如套接字或 WebSockets)时会更好。这当然有额外的前期成本,但允许您控制接收的更新内容和时间。理想情况下,该服务将在内存中保留一份用于服务客户端请求的数据库副本,同时自行更新实际数据库。这样可以最大限度地减少对数据库的查询(速度很慢)。

只有你知道正确答案,但我会选择第二个。当您需要超越简单查询的功能时,它将具有更高的性能、更好的可扩展性和可扩展性。

【讨论】:

From my experience, SQL server (or any other RDBMS) does not support notification of a change to connected client for ex, docs.oracle.com/cd/E11882_01/java.112/e16548/… or msdn.microsoft.com/en-us/library/ms175110(v=sql.105).aspx @I4V 知道这是否适用于 Azure SQL 服务器会很有趣。话虽这么说,我不知道存在,所以谢谢你教育我!如果您不打算将该信息放入答案中,我很乐意将其包含在我的答案中。请让我知道你打算做什么。 @I4V 谢谢!我已经用它更新了我的答案。我确实发现 SQL Azure 似乎不支持此功能 :( 但是再次感谢您提供的信息!

以上是关于套接字,轮询,无套接字结果?的主要内容,如果未能解决你的问题,请参考以下文章

非阻塞套接字轮询与阻塞套接字

套接字对、perl、KEEPALIVE 和轮询

Opera 将长轮询套接字打开

Web 套接字、长轮询、服务器发送事件和永久帧之间有啥区别?

Linux 中的异步套接字——轮询与回调通过

epoll - 轮询多个文件描述符(即套接字)