WebSocket :Nginx+WebSocket内部路由策略推送服务器的实现(附可生产环境应用代码)
1.项目背景
前几天写了一篇WebSocket推送的博客:WebSocket :用WebSocket实现推送你必须考虑的几个问题 支持的连接数大概几千个,具体数量依赖于tomcat能并发的线程数,但很多时候生产环境应用的话几千个肯定是不行的,所以本问介绍Nginx+WebSocket的实现思路及代码.
2.实现思路
依照设计模式中的 迪米特法则 外部调用模块来讲要尽量少的参与推送模块的逻辑,以达到解耦的目的,所以我们虽然通过Nginx+WebSocket做了集群策略,但是不应该让外部感知.对于外部调用模块来讲你是否应用集群与我调用你无关.
大概实现思路是这样的,推送服务要把不是本机的请求内部路由到相应兄弟服务器.很多同学有疑问了为什么要路由呢,Nginx到任意一个节点处理不是就可以了. 大家注意哈,http实现了无状态请求,但是对于ws来讲tcp长连接显然是一个有状态请求,举个例子:server A连接client a,你想通过server B给client a发消息是做不到的,因为tcp连接在server A上.
设计图: 
连接过程: 所有client连接地址均为Nginx地址,但是实际tcp连接是建立在具体服务器上的.连接完成后redis中要存储对应用户的serverId和SessionId(WsSession 是ws用来标识具体连接的).
发送消息过程:外部调用模块将消息发送到Nginx,假设发送消息的请求发送到了Server B上,那么Server B需要查出具体用户当前所连接的服务器,将请求路由转发到兄弟服务器上去.
3.源码地址
下载地址
http://download.csdn.net/download/shangmingtao/9920532
4.可优化的点
1.路由转发方式: 现在实现是用http转发的,效率很低,可以采用redis PUB/SUB方式 或者 rabbitMQ等.
2.路由转发内容: 我先再路由转发的是Client的userId+platform ,为的是能复用外部调用模块访问的接口.其实这里转发sessionId就可以了.
3.redis存储用户信息当前是序列化进去的.最好用hash这种数据类型.
5.Nginx配置及说明
user nobody;
worker_processes 1;
events {
worker_connections 8192; #这个要大一些
}
http {
upstream ws{
server 127.0.0.1:18080;
server 127.0.0.1:28080;
}
server {
listen 81;
server_name localhost;
# 动静分离处理
# location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
# root html;
# }
location ~/WSPush {
proxy_pass http://ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host:$server_port; #这个用来透传用户http请求头的,因为我代码里调用了request.getServerName()方法,如果不加个配置,取出来是http://ws
proxy_read_timeout 30m;#这里一定不要忘了改,默认1分钟后nginx会断开ws
}
}
}
转自:http://m.blog.csdn.net/shangmingtao/article/details/76639821
WebSocket :Nginx+WebSocket内部路由策略推送服务器的实现(附可生产环境应用代码)的更多相关文章
- spring集成webSocket实现服务端向前端推送消息
原文:https://blog.csdn.net/ya_nuo/article/details/79612158 spring集成webSocket实现服务端向前端推送消息 1.前端连接webso ...
- SingalR 构建 推送服务器初探
项目需要用到推送,于是重新研究了下推送框架,最好能够独立成一个服务,与业务无关的服务,可以给所有的项目通用.找了好久最终决定用SinglR 框架. Signal 是微软支持的一个运行在 Dot NET ...
- 用 centrifugo 搭建 消息推送服务器 docker + rancher 搭建
关于消息推送服务器 目前有很多第三方的开放成熟的推送服务.鉴于项目需要 我们项目需要自己搭建 自己的推送服务. 我们的推送应用场景 聊天消息 项目内部消息提醒 移动设备接受消息 应用到的相关软件工具知 ...
- 利用WebSocket和EventSource实现服务端推送
可能有很多的同学有用 setInterval 控制 ajax 不断向服务端请求最新数据的经历(轮询)看下面的代码: setInterval(function() { $.get('/get/data- ...
- WebSocket和kafka实现数据实时推送到前端
一. 需求背景 最近新接触一个需求,需要将kafka中的数据实时推送到前端展示.最开始想到的是前端轮询接口数据,但是无法保证轮询的频率和消费的频率完全一致,或造成数据缺失等问题.最终确定用利 ...
- SpringBoot2.0集成WebSocket,实现后台向前端推送信息
感谢作者,支持原创: https://blog.csdn.net/moshowgame/article/details/80275084 什么是WebSocket? WebSocket协议是基于TCP ...
- SpringBoot2.0整合WebSocket,实现后端数据实时推送!
之前公司的某个系统为了实现推送技术,所用的技术都是Ajax轮询,这种方式浏览器需要不断的向服务器发出请求,显然这样会浪费很多的带宽等资源,所以研究了下WebSocket,本文将详细介绍下. 一.什么是 ...
- WebSocket实现站内消息实时推送
关于WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议.什么是全双工?就是在同一时间可以发送和接收消息,实现双向通信,比如打电话.WebSocke ...
- Springboot:SpringBoot2.0整合WebSocket,实现后端数据实时推送!
一.什么是WebSocket? B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为服务器不 ...
随机推荐
- linux rpm 卸载,简单说明
平时Linux卸载文件总是遇到卸载不干净,各种依赖什么的,今天又是搞这玩意,就记录下一个比较常规的方法. 一.查询包括某关键字的软件(这里以卸载openoffice为例) 查询包括office的软件 ...
- 通过使用Netty实现RPC
目标:通过使用Netty框架实现RPC(远程过程调用协议),技术储备为以后实现分布式服务框架做技术储备.在这里实现自定义协议主要实现远程方法调用. 技术分析: 1.通过Java的反射技术我们可以获取对 ...
- mysql:查询以逗号相隔的字符串
首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...
- 【转】Symstore 详细使用
SymStore (symstore.exe) 是用于创建符号存储的工具.它被包含在Windows调试工具包中. SymStore按照某种格式存储符号,使得调试器可以通过时间戳.映像大小(对于.dbg ...
- 反汇编工具 objdump的使用简介
arm-linux-objdump -D led.elf > led_elf.dis objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf格式的可执行程序反过来得到反汇编代码 ...
- Android性能优化之数据库优化
本文为性能优化的第一篇——数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...
- L133
The U.S. Food and Drug Administration is considering a ban on flavorede-cigarettes in response to an ...
- linux initcall机制
Linux系统启动过程很复杂,因为它既需要支持模块静态加载机制也要支持动态加载机制.模块动态加载机制给系统提供了极大的灵活性,驱动程序既可支持静态编译进内核,也可以支持动态加载机制.Linux系统中对 ...
- CodeIgniter (CI)框架中的数据库查询汇总
引言: 前两天业务涉及到一个拉取答题排行榜的需求,数据库里数据是这样的: 同一个人可能提交过多次成绩,所以同一个人可能会有多次记录: 同一个人提交的多次成绩中可能有至少两次成绩是一样的. 于是,查询的 ...
- Arcgis for javascript不同的状态下自定义鼠标样式
俗话说:爱美之心,人皆有之.是的,没错,即使我只是一个做地图的,我也希望自己的地图看起来好看一点.在本文,给大家讲讲在Arcgis for javascript下如何自定义鼠标样式. 首先,说几个状态 ...