禁用ARR的Azure应用服务上的SignalR

时间:2017-11-09 16:28:43

标签: android azure redis signalr

我们的服务器每天在特定时间段内扩展1-3个实例。我们有Azure Redis背板用于信号器的连接持久性。除此之外,服务器未启用ARR Affinity。顺便说一句,我们使用ServerSentEvents for Androids和WebSocket for iOS。

问题是我们的移动用户(moto couriers)在移动信号较低时由于其提供商而经常断开连接或重新连接到SignalR服务器。

我们检查了移动端的所有内容。我们非常确定我们一次只有一个信号器连接。除此之外,当它们连接时,我们将它们的连接存储在持久存储(SQL数据库)上。

在向用户发送消息时,我们选择存储在数据库中的最新连接ID。这意味着我们只向客户端发送了一个连接ID。

但是我们得到一些关于我们通过服务器发送的消息的反馈在他们的手机上弹出两次(大多数时候消息在服务器有2或3个实例的高峰时间收到两次)。

我们无法追查它为何被收到两次,特别是在高峰时间。

问题是,这是关于ARR亲和力的吗?由于Redis背板使用订阅和发布方法,并且由于快递员经常断开/重新连接,因此他们有机会连接不同的服务器,因此,当服务器发送消息时,2台服务器可能会尝试发送该消息,并且它会在手机上弹出两次即使他们有一个连接。

其他信息;

SignalR DisconnectTimeOut = 60秒

SignalR KeepAlive = 20秒

1 个答案:

答案 0 :(得分:1)

这似乎是这样的原因,当发出新的连接请求时,您可能需要使用复制从其他服务器中删除现有的连接请求。

如果复制间隔足够短,它将最小化重复数量,对于其余部分,如果已经收到通知哈希/ id,则可能需要通过忽略上次通知来在客户端解决它。