当前位置: 首页 > 科技观察

signalR+redis分布式聊天服务器搭建

时间:2023-03-16 13:10:40 科技观察

最近在做一个直播项目,需要一个聊天服务器。以前做的比较小,也没有想太多,就只有一台服务器。前几天突然来了5000人,服务器瞬间就gg了。作为开发人员,我很尴尬!这是我们这篇文章的背景。我用C#Mvc4.0开发,这里需要一个redis。我不管你是windows版的还是linux版的。反正要有地址和端口,密码要根据实际情况填写。这里我用一个demo来展示分布式情况https://git.oschina.net/908Sharp/signalR-multi-Server.git第一步:创建两个mvc工程,从nugetInstall-PackageMicrosoft.AspNet中添加如下包。SignalRInstall-PackageMicrosoft.AspNet.SignalR.Redisinstall-packageMicrosoft.Owin.Cors第二步:在App_Start目录添加OwinStartUp类publicvoidConfiguration(IAppBuilderapp){GlobalHost.DependencyResolver.UseRedis("127.0.0.1",6379,string.Empty,"SignalRBus");app.Map("/signalr",map=>{map.UseCors(CorsOptions.AllowAll);varhubConfiguration=newHubConfiguration{EnableJSONP=true};map.RunSignalR(hubConfiguration);});}注意引用的包,年轻人。第3步:添加ChatHub类[HubName("chat")]publicclassChatHub:Hub{publicvoidChat(stringmsg){Clients.All.Display("ReceiveMsg:"+msg);}}后端已完成。第四步:创建前端页面

记得我上面说的demo是两个站,代码是一样的。在正式环境下,我们必须在不同服务器的Deploy中有一段代码指向同一个redis地址***我说这个东西是自动的生成的,你也可以手动指定,我还是把代码贴出来,你也可以F12自己看。/*!*ASP.NETSignalRJavaScript库v2.2.1*http://signalr.net/**版权所有(c).NET基金会。保留所有权利。*根据Apache许可证2.0版获得许可。有关许可证信息,请参阅项目根目录中的License.txt。**///////(function($,window,undefined){///"usestrict";if(typeof($.signalR)!=="function"){thrownewError("SignalR:SignalR未加载。请确保在~/signalr/js之前引用jquery.signalR-x.js。");}varsignalR=$.signalR;functionmakeProxyCallback(hub,callback){returnfunction(){//调用客户端hub方法callback.apply(hub,$.makeArray(arguments));};}functionregisterHubProxies(instance,shouldSubscribe){varkey,轮毂,米emberKey、成员值、订阅方法;for(keyininstance){if(instance.hasOwnProperty(key)){hub=instance[key];if(!(hub.hubName)){//不是客户端中心继续;}if(shouldSubscribe){//我们想要订阅hub事件subscriptionMethod=hub.on;}else{//我们想取消订阅hub事件subscriptionMethod=hub.off;}//遍历集线器上的所有成员并找到要订阅/取消订阅的客户端集线器函数if(!$.isFunction(memberValue)){//不是客户端中心函数}subscriptionMethod.call(hub,memberKey,makeProxyCallback(hub,memberValue));}}}}}$.hubConnection.prototype.createHubProxies=function(){varproxies={};this.starting(function(){//将集线器代理注册为已订阅//(instance,shouldSubscribe)registerHubProxies(proxies,true);this._registerSubscribedHubs();}).disconnected(function(){//取消订阅所有集线器当我们“断开连接”时代理。这是为了确保我们不会重新添加功能回调。//(instance,shouldSubscribe)registerHubProxies(proxies,false);});代理['聊天']=this.createHubProxy('聊天');代理['聊天'].client={};proxies['chat'].server={发送:函数(消息){returnproxies['chat'].invoke.apply(proxies['chat'],$.merge(["send"],$.makeArray(参数)));},sendOne:function(toUserId,message){returnproxies['chat'].invoke.apply(proxies['chat'],$.merge(["sendOne"],$.makeArray(arguments)));}};返回代理;};signalR.hub=$.hubConnection("/signalr",{useDefaultPath:false});$.extend(signalR,signalR.hub.createHubProxies());}(window.jQuery,window));这部分如果要指定具体的路径,也是可以的,不过我只是在后台写完这么一句,还没有放到正式环境中。哈哈哈,捂嘴笑吐血?现在很担心我们windows版的redis不稳定。