关于SignalR的内容延续:1.协商协议 2.分布式部署

既然项目中用到了,那就搞搞清楚,搞不懂就死   : >

前置内容: 

长轮询问题在ABP中的解决方案,SignalR_董厂长的博客-CSDN博客

“SingalR是对webSocekt的封装” ,这句话是片面的。

因为:

SignalR支持多种服务器推送方式:Websocket、Server-Sent Events、长轮询。默认按顺序尝试。

为什么支持多种?因为有些浏览器不支持webSocekt。

websocket和HTTP是不同的协议,为什么能用同一个端口。

通常 HTTP 是在 TCP 协议之上实现的。

  1. 如果 x 是基于 UDP 的,则 x HTTP 服务可以部署到“同一个”端口,不过这时的端口已没有比较的意义,因为 TCP UDP 有各自单独的协议栈,端口互不相干

  2. 如果 x 也是基于 TCP 的,则可以把 x HTTP 服务部署到不同地址(多个网卡多个 ip,或者 0.0.0.0 和本地 ip 上)的相同端口下,不过对于远程用户来说没什么意义

  3. x 实现使用 HTTP 协议的握手机制,由 HTTP 服务完成握手并交出 socket 控制权

 

协议协商的问题 

1、集群中协议协商的问题:“协商”请求被服务器A处理,而接下来的WebSocket请求却被服务器B处理。

2、解决方法:粘性会话和禁用协商。

3、 “粘性会话”(Sticky Session):把来自同一个客户端的请求都转发给同一台服务器上

交给负载均衡服务器缺点:因为共享公网IP等造成请求无法被平均的分配到服务器集群;扩容的自适应性不强。

 

4、“禁用协商”:直接向服务器发出WebSocket请求。WebSocket连接一旦建立后,在客户端和服务器端直接就建立了持续的网络连接通道,在这个WebSocket连接中的后续往返WebSocket通信都是由同一台服务器来处理。缺点:无法降级到“服务器发送事件”或“长轮询”,不过不是大问题。

 禁用协议协商的方式

 skipNegotiation: true, transport: signalR.HttpTransportType.WebSockets  };

connection = new signalR.HubConnectionBuilder()

  .withUrl('https://localhost:7047/Hubs/ChatRoomHub', options)

  .withAutomaticReconnect().build();

 分布式部署会遇到什么问题?

 1、四个客户端被连接到不同的两个服务器上,会出现,群发消息,可能只有c1和c2知道

2、解决方案:所有服务器连接到同一个消息中间件。前提条件:启用粘性会话,或者跳过协商

3、官方方案:Redis backplane

1)NuGet:Microsoft.AspNetCore.SignalR.StackExchangeRedis

 

2)builder.Services.AddSignalR().AddStackExchangeRedis("127.0.0.1", options => {

        options.Configuration.ChannelPrefix = "Test1_";

 

builder.Services.AddSignalR().AddStackExchangeRedis("127.0.0.1", 
options => {

        options.Configuration.ChannelPrefix = "Test1_";

其他更多高级功能:

Part5-20:外部向SignalR的Hub发送消息_哔哩哔哩_bilibiliPart5-20:外部向SignalR的Hub发送消息是.NET 6教程,.Net Core 2022视频教程,杨中科主讲的第163集视频,该合集共计195集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1pK41137He?p=163&vd_source=15d3bbce5ead922293cbb9978ffc74a2 

});

const options = {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值