1. 防火墙
我们的聊天客户端,不能要求用户对客户端的防火墙进行任何修改。(我们假设客户端防火墙已经允许传出到任意服务器的连接)。在Ice中,作为客户端活动而建立的新连接,请求通常只在一个方向上流动:从客户端(连接的发起者 )到服务端。

在回调的情况下,服务端通常会建立一个单独的连接回客户端:

但是,客户端防火墙对我们的推送模式提出了挑战,因为它会阻止服务端尝试建立新的连接:

我们可以使用Ice的双向连接方式来解决这个问题,该方式允许请求在客户端与服务端的现有连接的任一方向上流动。 有了这个方式,服务器就可以进行回调,而不需要建立一个新的连接到客户端:

更好的解决方案是将Glacier2路由加入到我们的设计中。Glacier2是一个Ice服务,通常驻留在服务器端的防火墙之后,并将来自客户端的请求安全地路由到后端服务器。客户端建立与Glacier2的双向连接,允许路由器通过客户端与Glacier2的连接,将回调从后端服务器转发到客户端:
所有实现推送模式的聊天客户端都使用Glacier2。