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服务器,减少服务器的负担,加快响应速度,因为服务器不 ...
随机推荐
- mysql数据库优化课程---12、mysql嵌套和链接查询
mysql数据库优化课程---12.mysql嵌套和链接查询 一.总结 一句话总结:查询user表中存在的所有班级的信息? in distinct mysql> select * from cl ...
- Git的add、commit、push命令
简单的代码提交流程1.git status 查看工作区代码相对于暂存区的差别2.git add . 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录3.git commit -m ‘注 ...
- Learining TypeScript (一) TypeScript 简介
Learining TypeScript (一) TypeScript 简介 一.TypeScript出现的背景 2 二.TypeScript的架构 2 1. 设计目标 2 2 ...
- datagrid中用tooltip
function msgFormat(value,row){ value = value.replace(/ /g," "); return '<span title='+ ...
- android 属性动画和布局动画p165-p171
一.属性动画 ObjectAnimator ObjectAnimator是属性动画框架中最重要的实行类,创建一个ObjectAnimator只需通过他的静态工厂类直接返回一个ObjectAnimato ...
- ZOJ 3488 Conic Section
The conic sections are the nondegenerate curves generated by the intersections of a plane with one o ...
- python练习题100例
链接地址:http://www.runoob.com/python/python-100-examples.html
- LeetCode OJ:Intersection of Two Linked Lists(两个链表的插入)
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- TCPL学习毕节:第六章hash表
对于P126的哈希表构成: struct nlist *install(char *name, char *defn) { struct nlist *np; unsigned hashval; if ...
- js数组,数字函数,字符串函数,表单验证,hashMap,堆栈,日期函数,call函数
1.javascript的数组API Js代码 收藏代码 //定义数组 var pageIds = new Array(); pageIds.push('A'); 数组长度 pageIds.lengt ...