横向扩展你的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,一经查实,立即删除!

相关文章

P3181-[HAOI2016]找相同字符【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3181 题目大意 两个字符串,求有多少个(l1,r1,l2,r2)(l_1,r_1,l_2,r_2)(l1​,r1​,l2​,r2​)使得字符串l1∼r1l_1\sim r_1l1​∼r1​的子串与l2∼r2l_2\sim r_2l2​∼r2​的子串相等。 解题思路 SAMSAMSAM做法 …

池化层(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节点代表的链的其中一段 …

【dfs】树(jzoj 2753)

树 jzoj 2753 题目大意: 给你一棵树,每一个点都一个值,现在问你有多少条路径可以满足以下条件: 1、方向都是向下 2、路径上的点的值总和为S 输入样例 3 3 1 2 3 1 2 1 3输出样例 2数据范围 对于30%数据,N⩽100N…

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 初学者. 项目最终完成的大致效果如图:声明: 以前虽然经…

P6139-[模板]广义后缀自动机(广义 SAM)

正题 题目链接:https://www.luogu.com.cn/problem/P6139 题目大意 求nnn个串的不同子串个数 解题思路 如何在SAMSAMSAM中插入多个字符串。 可以我们可以通过更改lastlastlast为之前的节点来做,如果插入一个之前插入过的节点就按照之前SAMSAMSAM的方法特判就好了。…

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

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

最小生成树(模板)

文章目录关于时间复杂度:Kruskal讲解Kruskal模板Prim讲解Prim模板昨天做蓝桥杯的题,最后一题最小生成树,但好久没用一下子生疏了。。。又过了几天离散学到了最小生成树。。。趁此复习一波最小生成树两种方法: Prim和Kruskal 关于…

【数论】挖掘机技术哪家强(jzoj 3858)

挖掘机技术哪家强 jzoj 3858 题目大意 给你多个n,对于每个n,x为n的因数,设s(x)为小于x且与x互质的数的和,让你求每一个x的s(x)总和 原题 有人问现实中为什么总是男生追求女生,反过来很少。实际上女生也是想主动追求…

.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[…

ST表讲解

ST表主要用于解决RMQ问题&#xff08;区间最值问题&#xff09; 当然你可以用线段树等&#xff0c;但今天用一种ST表&#xff08;倍增算法&#xff09; ST表是倍增算法的一个典型应用 暴力做RMQ问题&#xff0c;往往会超时&#xff0c;ST表利用对其进行优化 给定一段序列A&am…

P3346-[ZJOI2015]诸神眷顾的幻想乡【广义SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3346 题目大意 一棵树&#xff0c;求树上所有路径构成的字符串有多少种。&#xff08;叶子不超过303030个&#xff09; 解题思路 如果是根节点到一些节点的路径的话很好做&#xff0c;直接建广义SAMSAMSAM即可&#xff0c;…

纪中B组模拟赛总结(2020.2.1)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4414141lyflyflyf909090000909090000000 总结 T1T1T1直接爆炸&#xff0c;没想到是数学问题 T2T2T2想了出来&#xff0c;但忘记开mapmapmap了 T3T3T3直接懵逼 T4T4T4没有太了解欧拉函数导致翻车 题解 T1…

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

微软技术直通车&#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 …

[2020.11.26NOIP模拟赛]询问【字符串hash】

正题 题目链接:https://www.luogu.com.cn/problem/U142342?contestId37784 题目大意 一个字符串&#xff0c;定义两个字符串相似为用一些字母代替相同的字母后可以相同。 如urbbrgroorurbbrgroorurbbrgroor&#xff0c;apple≠abcdeapple\neq abcdeapple​abcde 要求支持…

LCA总结

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