用户A连接到服务器A,它将他放入内存列表以接收将来的更新.
用户B连接到服务器A,它通知列表中有人“登录”的所有用户.
……但是会发生什么
用户C连接到服务器C,服务器C的内存列表不包含用户A或B.
问题是我希望在集群(Web场)环境中实现它.这使事情变得复杂,因为我无法验证哪个机器最终会调用wcf调用,因此很难将任何消息传递给所有其他用户.
我能想到的最佳方案是实际让客户端连接到某种路由服务,该服务接收传入的请求并将客户端转发到特定的机器.当然,然后我失去了Web场的好处,因为单个机器有效地处理所有传入的请求.
一种不太有效的解决方案是让服务不断轮询某些内容(文件服务器上的文件或数据库中的表)查找更改.一旦出现更改,请将其推送给客户端.这似乎是一个非常丑陋的婴儿,所以.
我错过了什么?
更新 – 路由系统不可能满足我的需求.我的托管公司不允许我通过IP直接连接到服务器场中的特定计算机.我只能连接到通用的负载均衡器前端,因此无法保证我的用户最终会在同一台服务器上运行.
到目前为止,我们要在数据库中查询表中寻找更改.仍然看起来像一个丑陋的婴儿.
假设您对环境的控制超出了每个服务器上可以安装的范围(即没有MSMQ,没有ESB等),那么我将考虑使用WCF在服务器之间进行通信.简单的问题似乎是你有一个需要在两个服务器之间保持同步的内存列表,每当列表内容发生变化时,需要通知两个服务器的用户.使用两台服务器托管和使用的内部WCF服务,您可以使用简单的“即发即弃”消息来保持列表同步.想象一下以下场景:
>’用户A’登录到服务器A.
>将“用户A”添加到在线用户列表中
>向服务器B发送消息,通知添加的“用户A”
>使服务器B将“用户A”添加到其在线用户列表中
>使服务器B通知所有用户登录用户
>通知用户登录的服务器A上的所有用户
>’用户B’登录到服务器B.
>将“用户B”添加到在线用户列表中
>向服务器A发送消息,通知添加“用户B”
>使服务器A将“用户B”添加到其在线用户列表中
>使服务器A通知用户登录的所有用户
>通知用户登录的服务器B上的所有用户
>’用户A’从服务器A注销
>从在线用户列表中删除“用户A”
>向服务器B发送消息,通知其已删除的“用户A”
>使服务器B从其在线用户列表中删除“用户A”
>使服务器B通知所有用户注销用户
>通知用户注销的服务器A上的所有用户
>定期让服务器A和服务器B彼此同步其列表
(可以实现Ping-Pong风格……一台服务器将其列表ping到其他服务器,
其他服务器合并和pongs合并列表返回)
上述方案显然假设您能够在托管服务器上安装WCF服务,以便它们可以相互通信.我不确定你是否有能力在每个服务器内部知道其他服务器,因为你提到所有流量必须通过负载均衡器.