所以我一直在寻找,即当IIS托管,并通过Silverlight的连接到人的双工通信创造了样品示例。 有很多这种在那里的例子( 这个MSDN文章是伟大的 ),但都使用相同的模式:
用户A连接到服务器A,这让他在内存中的列表获得未来的更新。
用户B连接到服务器A,它会通知所有用户列表中有人“登录”。
...但是会发生什么时
用户C连接到服务器C,在内存中的列表服务器C不包含用户A或B.
问题是,我期待在群集(网络场)环境中实现这一点。 因为我无法验证这个复杂的事情机器会倒闭守备WCF调用,所以中继的任何消息给所有其他用户是困难的。
我能想到的最好的情况是真正有客户端连接到某种路由服务的,是以传入的请求和客户端转发到特定的机器。 当然,然后我失去了Web场的好处,因为一台机器被有效守备所有传入的请求。
一个不太有效的解决方案是有不断的服务轮询的东西(无论是在文件服务器或文件在数据库表)寻找变化。 一旦变化都存在,他们推出到客户端。 这似乎是一个非常难看的宝宝,寿。
有什么我错过了?
UPDATE - 路由系统是无法满足我的需求。 我的托管公司不会让我直接连接到特定的机器上通过IP农场。 我只能连接到通用负载平衡器的前端,所以不能保证我的用户会出现在同一个服务器上。
到目前为止,我们已经到投票站在db表中寻找变化。 不过似乎是一个丑陋的婴儿。
假设你有超越你可以在每个服务器(即没有MSMQ,没有ESB等)上安装什么零控制你的环境,那么我会考虑使用WCF服务器之间进行通信。 简单的问题似乎是,你有一个在内存中的列表,需要保持两个服务器之间的同步,每当列表的内容发生变化,这两个服务器的用户需要通知。
随着两个服务器主机和使用,你可以使用简单的内部WCF服务,发射后不管的消息,以保持列表同步。 想象一下以下情形:
- “用户A”登录到服务器A
- “用户A”添加到在线用户列表
- 火消息到服务器B,以通知添加“用户A”的它
- 导致服务器B,以“用户A”添加到其在线用户列表
- 导致服务器B通知用户登录的所有用户
- 通知所有用户在用户登录的服务器A
- “用户B”登录到服务器B
- “用户B”添加到在线用户列表
- 消防信息到服务器A,通知ADDD“用户B”的
- 导致服务器A“用户B”添加到其在线用户列表
- 导致服务器A通知用户登录的所有用户
- 通知所有用户在用户登录的服务器B
- “用户A”注销服务器A的
- 从在线用户列表中删除“用户A”
- 火消息到服务器B,以通知已移除“用户A”的它
- 导致服务器B从它的在线用户列表中删除“用户A”
- 导致服务器B通知用户注销的所有用户
- 通知所有用户在注销用户的服务器A
- 定期,有服务器A和服务器B同步他们的名单相互(可以实现乒乓风格......一个服务器ping其名单的其他服务器,其他服务器合并和合并pongs列表返回)
以上情景明显假设你有你的托管服务器上安装WCF服务,使得它们能够相互通信的能力。 我不知道,如果你有能力,内部为每个服务器,要知道其他服务器的,正如你所提到的所有业务都需通过负载平衡器。
假设你不需要的通知实时型,典型的方法是使用一个后端会话数据库或专用的会话服务器使所有当前登录的用户对所有群集计算机可见。 然后,您可以根据您的要求编写的查询服务发送更改通知,或一些更先进。
在你的榜样,你的“内存”用户列表移动到共享内存的服务器或共享的数据库。 当然,你也可以实现某种形式的集群更新通知发送给所有的机器,但是那复杂性可能会远远超出你的需求。
能服务器直接相互通信? 如果是这样,你可能想建立场中的唯一的其他服务器可以连接到专用终端。 然后,当服务器C接收到一个消息,它发送一个消息到服务器A通知它的这一事实,然后服务器A可以沿向客户转发此。
使用Memcached的或MSMQ。
随着Memcached的,你会使用它作为真理的用于需要进行广播的所有项目的单点。 所以,当你得到一个客户端登录,你倾倒一些简单的数据到Memcached的。 它会通知其他服务器,并更新其他服务器的列表。 然后,当你发布的信息,查询Memcached的。
随着MSMQ,推登录信息到一个队列,然后实现在两台服务器上的听众,从队列中读取和更新的“可发布的”信息的内存列表。 这样一来,两个服务器都保持获悉,需要得到公布的数据。
请问您的解决方案提供商使用MS SQL数据库服务器的? 如果你有充分的权利MS SQL数据库,你可以实现T-SQL触发器。 你可以写,当一个数据库CRUD操作时执行代码的触发器。 随着MS SQL的当前版本,你甚至可以执行所管理(C#/ VB#)代码。
该解决方案将是非常复杂的,但可能的。 我会用一个中央MS SQL为群集和写一些T-SQL触发器代码。 当你关心的记录被修改的/ etc我将有SQL服务器集群中发送特殊的HTTP web请求消息发送给其他服务器(假设集群中的服务器,可以随意跟其他/所有群集服务器),让他们知道的任何变化。 然后,每个服务器可以使用全局应用程序缓存广播更改服务器上的每个会话。
这是我过的顶建议。
-Jeff
看起来你需要使用一个对等网络(netPeerTcpBinding)。 我不知道,如果你的主机环境将支持这一点。
http://msdn.microsoft.com/en-us/library/cc297274.aspx
您可以使用“粘性IP”配置您的Web农场。
这意味着,当一个客户端连接到Web场,他被路由到一台机器。 从客户端的所有请求之后会到同一台机器上的农场。 这工作有点像你在你的问题已经描述的路由服务。
编辑
这可能是最简单的实现轮询系统,其中Silverlight客户端请求的Web服务器“有什么新的我”时,该请求将包含的最后一次客户要求的时间。 新事物的名单将被存储在一个数据库表。 所以你打没有问题,其Web服务器。
此外,您还需要注意在Silverlight WCF的局限性,如果我理解正确的话就不会实现所有WCF的。
编辑2
在你需要在同一时间向所有用户沟通的情况下,呼叫不需要走一路下跌到数据库。 这可以在WCF服务水平内存中缓存,其他客户端将从内存得到这个,给你的数据库更好的性能和更低的负载。
编辑3
只要你使用的是Silverlight客户端就很难为客户相互直接通信。 还有虽然他们需要额外的工作/成本2个possiblities:
- 使用天青服务总线,在云中的每个客户端会谈到端点,其被转换成直接通信。
- 删除使用Silverlight,使用一个客户端可以公开WCF服务端点。 当客户端启动时,它注册到服务器端点。 然后,每个客户可以要求谁在线服务器,并直接发送信息到客户端。
从MS速度的项目可能是你不是一个数据库后端一个更快的解决方案; 这是一个在内存中缓存层与所有的集群/故障切换花哨的东西......你可以滑动WEB和数据库层之间; 它的API非常简单,与.NET的其余部分也一致。