Shanghai, China

E-mail: henter@henter.me
Weibo: @周攀Henter

用Node.js结合RabbitMQ实现APN推送

最近刚开始看nodejs,于是想把之前写得稀烂的Python+RabbitMQ实现多线程APN推送推送重写一次。

实际完成后代码量很少,用到了两个库 node-apnnode-amqp,我要做的只是将两者结合起来打打酱油。

需要完善的部分:

rabbitmq的ack机制

现在仅仅是拿到消息调用推送函数后就返回ack了,实际上此时并不确定是否推送成功了(因为是异步),所以应该是在推送的transmitted事件触发后再返回ack。

准备工作:

安装rabbitmq
拿到推送证书 cert.pem和key.pem
修改receive.js中的队列名称

运行:

npm install
node receive.js

demo代码已发到https://github.com/henter/NodeRabbitMQAPN

APN推送峰值大概为2000条每秒,完爆之前python多线程的实现方式。

Python+RabbitMQ实现多线程APN推送

这篇是用来填坑的,填之前的一篇Python实现APN推提到的坑。。 之前的apn推送实现方式比较原始,没有做容错、超时等处理,只能将就着用,现在做了些改进,另外,结合RabbitMQ队列实现多线程推送。

代码已发到https://github.com/henter/PythonRabbitMQAPN

主要分为4个文件

receive.py          连接rabbitmq,开启多线程
thread_manager.py   仅仅为开启多线程做调用
push_ios.py         推送
apns.py             推送接口

实现代码比较搓,大家将就着看吧

另外,pika这个库官方并不推荐用于多线程环境,推荐在每个线程内单独连接RabbitMQ,导致的结果就是,如果开启比较多线程,会产生大量的RabbitMQ连接,CPU占用比较高。

Pika does not have any notion of threading in the code. If you want to use Pika with threading, make sure you have a Pika connection per thread, created in that thread. It is not safe to share one Pika connection across threads.

这种实现方式只能算是勉强够用,线程数量是根据队列内的消息数量动态控制的,推送高峰期会产生比较多的连接,会断断续续产生rabbitmq连接失败的问题,平时基本稳定。

APN推送峰值大概为300条每秒(开启100个线程时),效率比较低。

代码如下:

PS:

后来也尝试过rabbitpy这个库(作者也是pika的维护者),号称是线程安全。 不过测试过程中发现另外一个问题,在同一线程内只能同时用一个Consumer,否则会报错

测试下来虽然没有前面的报错,不过两者性能相差不大,最终还是没有用这个库。

后面打算用NodeJS重写这套推送系统。

Mac下PhpStrom无法输入中文的问题

很早就遇到这个问题了,在用PhpStrom时无法输入中文。表现为,中文输入法状态栏上有中文显示,但是输入到IDE里面就是英文。

刚开始以为是输入法问题,换了QQ输入法、Squirrel鼠须管等,都没办法。

后来干脆放弃了,正好强迫自己在项目中使用英文写注释什么的。

现在由于项目内必须要用中文,google之,找了好几个方法试了才搞定。

有效方法如下:

sudo vim /Applications/PhpStorm.app/bin/idea.vmoptions

在最后一行加上

-J-Djava.awt.im.style=on-the-spot

然后,Command+Q完全退出PhpStrom

切换当前输入法为英文状态

重新启动PhpStrom,OK了,可以正常输入中文。

参考:

http://www.blogjava.net/JAVA-HE/archive/2011/11/15/363772.html

https://code.google.com/p/rimeime/issues/detail?id=311

修复Nginx报错:upstream sent too big header while reading response header from upstream

今天调试symfony时发现一直502,日志里面有如下报错:

2013/10/11 23:18:44 [error] 51982#0: *1 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: work.cc, request: "POST /api/user/register HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "test.work.cc", referrer: "http://test.work.cc/api/doc/"

google一番,解决方法如下:

nginx.conf 的http段,加入下面的配置:

proxy_buffer_size  128k;
proxy_buffers   32 32k;
proxy_busy_buffers_size 128k;

重启后一般就可以解决, 如果还是报502,再在host配置的php段加入下面配置:

fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;

重启nginx即可。

参考:

http://hi.baidu.com/wastorode/item/ec86ade6ac0af7a2c10d75f4

http://stackoverflow.com/questions/13894386/upstream-too-big-nginx-codeigniter

Fork me on GitHub