备注:
 
   Nchan 的数据持久化,以及ha 都是通过redis实现的,如果要做到无单点可以使用redis cluster 
   同对于Nchan server 进行多副本
 
1. 安装
下载nginx or openresty 源码同时下载Nchan 源码进行编译打包即可
 2. 简单sub/pub 配置
location 配置
location = /sub {
nchan_subscriber;
nchan_channel_id $arg_id;
nchan_use_redis on; // 关键
} location = /pub {
nchan_publisher;
nchan_channel_id $arg_id;
nchan_use_redis on; // 关键
}
redis server 配置
nchan_redis_url "redis://127.0.0.1:6379";
3. ha 配置(伪ha,实际就是nginx 反向代理两台编译了Nchan 的nginx)
lb 配置

  server:
server {
listen 8089;
location / {
proxy_pass http://ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
} upstream:
upstream ws {
server xxxxxx:80 weight=2 max_fails=2 fail_timeout=30s;
server xxxxxxxx:8090 weight=1 max_fails=2 fail_timeout=30s;
}
Nchan 配置:
参考上面的,必须在一台机器 redis cluster 版本的配置 http {
upstream redis_cluster {
nchan_redis_server redis://127.0.0.1:7000;
nchan_redis_server redis://127.0.0.1:7001;
nchan_redis_server redis://127.0.0.1:7002;
# you don't need to specify all the nodes, they will be autodiscovered
# however, it's recommended that you do specify at least a few master nodes.
}
server {
listen 80; location ~ /sub/(\w+)$ {
nchan_subscriber;
nchan_channel_id $1;
nchan_redis_pass redis_cluster;
}
location ~ /pub/(\w+)$ {
nchan_publisher;
nchan_channel_id $1;
nchan_redis_pass redis_cluster;
}
}
}
4. 测试
// http post data 

curl \
-H "Content-type: application/json" \
-d '{"name": "dalong","age":333}' \
'http://xxxxx:8089/pub?id=demo' // browser recived data
var ws =new WebScoket("ws://xxxxx:8089/sub?id=demo")
ws.onMessage=funciton(data){
console.log(data) }
  打开多个浏览器会发现数据是同步的,没有添加redis 的会出现数据无法接受到了
 
5. redis 数据存储查看
127.0.0.1:6379> KEYS *
1) "{channel:/demo}"
2) "{channel:/demo}:msg:1511175437:2"
3) "{channel:/demo}:msg:1511175436:2"
4) "{channel:/demo}:msg:1511175435:0"
5) "{channel:/demo}:msg:1511175437:0"
6) "{channel:/demo}:messages"
7) "{channel:/demo}:msg:1511175436:0"
8) "{channel:/demo}:msg:1511175437:3"
9) "{channel:/demo}:msg:1511175424:1"
10) "{channel:/demo}:msg:1511175437:1"
11) "{channel:/demo}:msg:1511175436:3"
12) "{channel:/demo}:msg:1511175436:1"
6. 参考文档
https://nchan.io/#channel-multiplexing
https://nchan.io/documents/nginxconf2016-slides.pdf(很不错的分享)
 
 
 
 

Nchan 实时消息ha 配置的更多相关文章

  1. Nchan 实时消息 安全配置

    备注:     即时消息的安全对于我们来说是比较重要的,作者在设计Nchan 的时候已经考虑了 a. nchan_authorize_request (Hooks and Callbacks)可以集成 ...

  2. Nchan 实时消息内置变量

      以下参考官方文档:   $nchan_channel_idThe channel id extracted from a publisher or subscriber location requ ...

  3. 实时消息平台NSQ的特性

    NSQ是GO语言开发的可用于大规模系统中的实时消息服务,但是和RabbitMQ等相比,它具有什么特色,什么场景下选择NSQ呢? NSQ的自身特色很明显,最主要的优势在如下三个方面: 1,性能.在多个著 ...

  4. NSQ:分布式的实时消息平台

    NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版.NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其 ...

  5. 开源实时消息推送系统 MPush

    系统介绍 mpush,是一款开源的实时消息推送系统,采用java语言开发,服务端采用模块化设计,具有协议简洁,传输安全,接口流畅,实时高效,扩展性强,可配置化,部署方便,监控完善等特点.同时也是少有的 ...

  6. Centrifugo  语言无关的实时消息服务

    Centrifugo 语言无关的实时消息服务,基于golang编写,提供了websocket 以及sockjs 的兼容处理,使用上很简单 同时也支持基于redis的扩展,以下是一个简单的运行测试 环境 ...

  7. CentOS7安装CDH 第七章:CDH集群Hadoop的HA配置

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  8. 未读消息(小红点),前端与 RabbitMQ实时消息推送实践,贼简单~

    前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢. 之前在 <springboot ...

  9. 我有 7种 实现web实时消息推送的方案,7种!

    技术交流,公众号:程序员小富 大家好,我是小富- 我有一个朋友- 做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能. 不过他还没想好用什么方式做,这里 ...

随机推荐

  1. 委托---.net4.0提供两个比较重要的委托

    public delegate void Action<[in T1][,in T2][,in T3]......>([T1 t1][,T2 t2][,T3 t3]...) public ...

  2. AtCoder Regular Contest 078D

    两边bfs,先一边找到从1到n的路径并记录下来,然后挨个标记,最后一边bfs找1能到达的点,比较一下就行了 #include<map> #include<set> #inclu ...

  3. 1-27 sed基本编程和cut基本应用

    大纲: 一.sed基本编程 sed详解.Usage.操作实例 二.cut命令应用 cut命令详解.Usage.操作实例 ######################################## ...

  4. bzoj 1087 状压dp

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4130  Solved: 2390[Submit][ ...

  5. JavaScript中Function Declaration与Function Expression 或者说 function fn(){}和var fn=function(){} 的区别

    JavaScript是一种解释型语言,函数声明会在JavaScript代码加载后.执行前被解释,而函数表达式只有在执行到这一行代码时才会被解释. 在JS中有两种定义函数的方式, 1是:var aaa= ...

  6. Dir命令

    注: 此系列为自己之前所搭建网站内容. 其实python的os模块能够很好的完成此任务.改天总结下. 之前在处理气象数据时,十几个文件,文件名比较长,需要自己处理变动的年份找出地址的规律再进行文件的读 ...

  7. C++复习5.指针数组字符串

    C/C++ 指针.数组和字符串 本次学习指针.数组.字符串.引用的内存映像. 1.指针 指针的本质:可以执行的程序是由指令.数据和地址组成的.当CPU访问内存单元的时候,不论是读取还是写入,首先要把内 ...

  8. Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理

    1.加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  9. 浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n

    转载自:浅谈<剑指offer>原题:求1+2+--+n 如侵犯您的版权,请联系:windeal12@qq.com <剑指offer>上的一道原题,求1+2+--+n,要求不能使 ...

  10. Python中的数据结构 --- 元组(tuple)、字典(tuple)

       元组(tuple)本身是不可变数据类型,没有增删改查:元组内可以存储任意数据类型一.元组的创建 例:t = (1,2.3,'star',[1,2,3])      ## 元组里面包含可变类型,故 ...