横向扩展你的ASP.NET Core SignalR 应用

前言

最近项目要用signalr来做实时通信,在研究asp.netcore signalr 应用横向扩展时候发现了这篇国外的博客,和大家分享一下
原文连接地址


负载均衡

当你把你的应用部署到生产环境时,你将会想横向扩展你的应用。横向扩展意味着要你的应用要在多台服务器上运行。
当应用运行在云端进行横向扩展时,你要考虑的主要问题时设置你想运行服务器的数量。有一种叫做负载均衡的机制,
这种机制会对每个传入的请求选择一个服务器。负载均衡能按照顺序选择不同的服务器或者根据其他的处理逻辑继续选择同一个。


Websockets

当使用web sockets时没有什么问题(译注:意思指使用无状态的负载均衡时候)。因为web sockets一旦建立了就像服务端和浏览器建立了一个管道。但是当使用轮询或者长轮询时候就可能出现,每个消息时不同的请求并且每个处理的请求都能转换到不同的服务器。服务器坑不知道之前发送到这个客户端的消息和关于这个消息的上下文。
举例你的应用被横向扩展到不同服务器山,服务器1正在获取关于准备订单1(prepare order 1)的请求然后它开始处理这个请求。当你使用长轮询方式进行请求时候,接下来的请求会通过负载均衡分配到不同的服务器。这个服务器是不知道关于 订单1(order1)的信息的。
对于服务端发送事件(译注:关于服务器发送事)也会出现同样的问题,因为http连接可能会被删除,这个连接将立刻会通过在浏览器的事件源(EventSource)恢复。


粘连会话(Sticky Sessions)

我们能通过使用粘连会话解决这个问题。粘连会话有很多种实现,大部分实现方式如下,对于第一次请求的响应负载均衡能在浏览器设置一个cookie用来指明这个使用的服务器。在接下来的请求负载均衡能读取这个cookie并且分配这个请求到同一台服务器。

640?wx_fmt=png

IIS和Azure web应用的粘连会话的版本称作应用请求路由关联(Application Request Routing Affinity )或者 ARR Affinity。自从SignalR能使用 非web sockets 传输协议,当你使用已经安装好ARR Affinity 模块的IIS内网服务器时,你就应该在你应用运行的所有的服务器端开启它。同时也要确保web sockets也同样是要开启的。否则你的服务器将会使用服务器发送事件。

640?wx_fmt=png


在不同应用实例之间同步客户端

但是这里会存在另外一个问题。举例说一个使用Office 365的用户通过web document 工作,然后她邀请了其他人加入。其他人可能在与先前用户不同的服务器上。现在当使用服务器1的用户(译注:指第一个用户)不得不发送 改变文档的消息到其他人。但是服务器1不知道在其他服务器上连接这个 管道(Hub)上的其他用户的信息。为了解决这个问题服务器需要一种方式进行数据共享。这样方式能通过数据库来实现,但是用一个存储更快的可替代的方案就是使用redis缓存。SignalR支持开箱即用的redis,我们接下来就会看到。它实际上就是使用了Redis内置的发布订阅功能来同步不同服务器上的客户端信息。
解决这个问题是非常简单甚至不需要一个截图。安装一个Microsoft.AspNetCore.SignalR.Redis nuget包。然后在startup类中的 configure services方法中的AddSignalR后面输入 AddRedis 并且传入一个redis连接字符串。你能自己搭建Redis服务器或者使用 Azure Redis service。除了Redis你同样也可以使用社区构建的其他数据存储。但是Redis的优势就是它甚至不需要持久化这个数据。


Azure SignalR Service

除了粘连会话、Redis 缓存我们还没有讨论连接限制。每个客户端同时有六个连接的Http连接限制。当使用长轮询或者服务器发送事件这个限制很快就会达到了。即使web sockets也有大约50个连接限制。如果你不喜欢管理这些东西,这里有一个一站式解决方案:Azure SignalR Service。它的工作原理如下:

640?wx_fmt=png

所有的客户端连接都被托管在Azure SignalR Service上,所以客户端并不是真正连接到你应用运行的服务器上。当一个新的客户端连接或者你发送一个消息到所有的客户端或者分组或者独立的客户端时候,你的应用实际上经过了一个管道连接,这个管道连接负责与SignalR Service(译注:指Azure SignalR Service)通信。只要你为需要同时支持的连接付费,那么你所有包含hub的应用代码只需要运行在服务器上,你关心的 粘连会话、Redis缓存以及连接限制都将不是事儿。
结合Azure SignalR Service 和增加Redis缓存一样简单。(译注:这里有一个github上关于signalr 客户端同步的issue,供大家参考一下,链接地址)

原文地址: https://bluetianx.github.io/2018/08/18/Asp-netCoreSignalR/


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

池化层(pooling)

目录 一、池化层 1、最大池化层 2、平均池化层 3、总结 二、代码实现 1、最大池化与平均池化 2、填充和步幅(padding和strides) 3、多个通道 4、总结 一、池化层 1、最大池化层 2、平均池化层 3、总结 池化层返回窗口中最大或平均值环节卷积层对位置的敏感性同样有窗口…

牛客网【每日一题】4月16日题目精讲 逆序对

文章目录题目描述题解:代码传送时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 131072K,其他语言262144K 64bit IO Format:%lld 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j位分别…

[BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

首先,我们求出树的重链,然后对于每一条链,建一颗线段树 树大概长这样: (其中用红边连起来的是一条条重链) 在线段树上,我们维护: Opt(u):经过 u节点代表的链的其中一段 …

ASP.NET Core Web API + Identity Server 4 + Angular 6 实战小项目视频

今天开始尝试录制ASP.NET Core Web API的教学视频. 这是一个小项目的实战视频, 该项目采用了:ASP.NET Core 2.1 做APIIdentity Server 4Angular 6Angular Material这个项目比较简单, 适合ASP.NET Core Web API 和 Angular 初学者. 项目最终完成的大致效果如图:声明: 以前虽然经…

[USACO]Sprinklers 2: Return of the Alfalfa P(网格DP)

思路: 由题目易得:网格内种植的两种植物形成了一条 左上—右下 的分界线,考虑将问题转化成 DP求出有多少条合法的分界线 我们注意到: 分界线上的点都必须放洒水器,且所放洒水器有唯一选择; 其他的可以放洒…

.net core grpc consul 实现服务注册 服务发现 负载均衡(二)

在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net core grpc 通信 的基础上加上 服务注册&#x…

【BZOJ3218】a+b problem (最小割 + 主席树)

传送门 继续优化&#xff1a;把a[ ]离散化 #include<bits/stdc.h> using namespace std; const int inf1000000007; const int N200010; const int M1000010;struct Edge{int u,v,f,next; }edge[M]; int head[N],cnt; int s,t,flow,level[N];struct Node{int x,id; }e[…

微软技术直通车(第三期)现场实录

微软技术直通车&#xff08;第三期&#xff09;于本月18日14时&#xff0c;在中国微软总部圆满举行。本次活动得到了微软最佳有价值专家&#xff08;Microsoft MVP&#xff09;中国区项目组的鼎力支持。同时&#xff0c;Microsoft MVP中国区项目组负责人也亲临现场致辞&#xf…

[NOI2019] 序列(模拟费用流)

原先自己想的建图&#xff1a; 正确建图&#xff1a; 但是 n 太大了&#xff0c;所以考虑模拟费用流&#xff1a; 注意&#xff1a; 在1中&#xff0c; 若选的两个位置相同&#xff0c;则为情况2&#xff0c;不用减 f&#xff1b; 若选的位置在另一序列中已被选&#xff0c;…

【结论】游戏(jzoj 5536)

游戏 jzoj 5536 题目大意&#xff1a; 给一个范围和一个矩形&#xff0c;让你在这个范围内放若干个这样的矩形&#xff08;不能改变方向&#xff0c;不能重叠&#xff09;&#xff0c;让你求出最少放多个矩形可以使范围内无法再放矩形 输入样例#1 11 4 3 2输入样例#2 10 …

LCA总结

文章目录LCA介绍解决方法概括&#xff1a;倍增法&#xff1a;Tarjan欧拉序树剖解法&#xff1a;看了很多关于LCA的文章&#xff0c;这里是一个总结我们通过这个题洛谷P3379 【模板】最近公共祖先来讲LCA LCA介绍 lca是啥&#xff1f;最近公共祖先 就是&#xff1a;两个点在这…

ASP.NET Core Web API + Ng6 实战视频 Day 2

第一天课程&#xff1a;ASP.NET Core Web API Identity Server 4 Angular 6 实战小项目视频Day 2 第一部分:Day 2 第二部分:视频专辑持续更新中....地址请点击原文链接.原文地址: http://v.qq.com/vplus/4cfb00af75c16eb8d198c58fb86eb4dc/foldervideos/8hk0029019k2fft.NET…

浮沉子

浮沉子制作及其原理 浮沉子的下沉过程&#xff1a;

.NET Core 项目指定SDK版本

一. 版本里的坑自从 .NET Core 2.1.0版本发布以后&#xff0c;近几个月微软又进行了几次小版本的发布&#xff0c;可见 .NET Core 是一门生命力非常活跃的技术。经过一段时间的实践&#xff0c;目前做 ASP.NET Core 开发时&#xff0c;使用的 Nuget 包&#xff0c;比如 Microso…

牛客网【每日一题】4月17日题目精讲 华华给月月准备礼物

文章目录题目描述题解&#xff1a;代码&#xff1a;推荐例题&#xff1a;试题链接时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 二月中旬虐狗节前夕&#xff0c;华华决定给…

Bing.com在.NET Core 2.1上运行

相关知识请参考.netCore开发团队博客 https://blogs.msdn.microsoft.com/dotnet/ Bing.com是一种云服务&#xff0c;运行在遍布全球许多数据中心的数千台服务器上。Bing服务器每秒处理来自全球消费者的数千个用户查询&#xff0c;通过他们的浏览器&#xff0c;使用Microsoft认…

c#中关于协变性和逆变性(又叫抗变)帮助理解

今天回忆了之前看的《深入理解C#》这本书中的泛型章节&#xff0c;其中对泛型的可变性的理解。泛型可变性分两种&#xff1a;协变和逆变。逆变也又称为抗变。怎么理解这两个名词的意思&#xff1a;①&#xff1a;协变即为在泛型接口类型中使用out标识的类型参数。协变的字面意思…

C# 7.0中的解构功能---Deconstruct

解构元组C#7.0新增了诸多功能&#xff0c;其中有一项是新元组(ValueTuple)&#xff0c;它允许我们可以返回多个值&#xff0c;并且配合解构能更加方便的进行工作&#xff0c;如下面例子可以看到解构元组可以写出优雅的代码&#xff0c;并且可以使用类型推断&#xff0c;但在这里…

csp初赛复习(往年真题+解析)

排序算法 前缀/后缀表达式 二进制补码、反码 最短路 图片/音频/视频文件格式 前序/中序/后序遍历 以比较作为基本运算&#xff0c;在 N 个数中找最小数的最少运算次数为&#xff08; &#xff09;。 A. NNN B. N−1N-1N−1 C. N2N^2N2 D. logNlogNlogN 正确答案&#xff1a; B …

ASP.NET Core 2.1中基于角色的授权

授权是来描述用户能够做什么的过程。例如&#xff0c;只允许管理员用户可以在电脑上进行软件的安装以及卸载。而非管理员用户只能使用软件而不能进行软件的安装以及卸载。它是独立的而又与验证配合使用&#xff0c;需要身份验证机制。对于应用程序来说&#xff0c;首先需要进行…