Mega-wechat
Mega-wechat是一款发送微信模板消息的服务,基于Swoole网络框架实现。支持大量的消息发送,并发执行发送模板消息接口,整个发送过程按照先来先服务的队列执行。支持定制模板消息,随时改随时用。
Github地址:
设计初衷
在公司里运营需要经常发送微信模板消息到指定的用户,那时候其他业务的实现比较紧急,所以仅仅是简单的写死一些模板消息到controller里面,用的时候执行下命令完成运营的需求。因此也造成改模板内容的时候需要改代码并用git更新,而且由于单进程的问题大量的模板消息发送会非常耗时(主要是curl调用微信接口的耗时)。
对此想到了几种解决方案:
第一种直接实现一个多进程的client通过curl调用微信发送模板消息API,这种方法实现起来简单快捷,但无法支持其它业务调用模板消息的需求。
第二种是由一个进程分发任务fork多个子进程,通过子进程不断轮询redis队列,这种方案也是实现起来也是比较简单,但可控性太差基本上是很难控制的。
第三种也是目前使用的方案,是通过swoole实现一个类似于消息队列的服务,由多个task执行慢速的curl调微信API的操作,并且可以返回执行后的结果给到客户端。由于swoole是一个非常强大的网络框架,能接收很大并发,理论上来说大量的发送模板消息请求,swoole都可以撑得住,但因为微信的发送模板消息API耗时比较高,大量的请求投递到task中执行,由于处理的速度比不上接收的速度,将会导致缓冲区溢出,所以Mega-wechat里用上了文件队列,将请求都先投入到队列中,等待task进程空闲时,从队列中取出请求并投递到task中处理发送模板消息请求。这样的实现就不会导致缓冲区溢出,而且还能支撑大量的并发。但是由于微信对模板消息有一套规则限制,所以大量的调用API仅仅是理论上的。
功能特性
- 发送微信模板消息
 - 多进程执行发送模板消息接口
 - 队列时序性
 - 文件消息队列存储
 - 基于Swoole高性能网络框架
 - 发送消息完成,通知客户端。
 
使用场景
- 对业务上发送模板消息的解耦。
 - 即时发送模板消息请求,无需等待微信API调用耗时。(前提是对发送成功或失败不关心)
 - 实现可控制发送进度的模板消息任务。
 - 随时修改模板消息内容,方便运营操作。
 
系统架构
Mega-Wechat系统架构如下图所示:
系统执行过程描述: 
 1. 客户端发送模板命令请求到服务端。 
 2. 服务端Worker进程接收到命令后会解析命令并push到队列中。 
 3. 从队列中pop出已在队列中的请求,并投入到task进程处理请求。(由于task进程有限,大量的发送模板请求将会缓存到队列中,等待task进程空闲后继续从队列pop出请求后投入。) 
 4. 在task进程中执行发送请求处理,主要是调用微信模板消息接口等待接口响应。 
 5. 对微信响应的结果进行成功或失败的相应处理后,再把结果响应给客户端。
以上描述是一个同步的过程,对于客户端而言可以是异步或同步的处理。
目录结构
config/             服务器配置
libs/               
    Network/
    Server/         
    Swoole/         Mega核心类库
    Wechat/         微信API
logs/
vendor/             支持composer,依赖monolog写日志
autoload.php
mega                Mega命令入口 
介绍
环境要求
- php5.6+
 - Swoole1.8.2+
 - Mysql
 - Linux系统
 
安装
第一步 
 安装PHP,需要5.6以上版本。由于服务端的队列用了SPL函数和PHP新特性的语法
第二步 
 安装Mysql,什么版本都可以。
yum install mysql
安装成功Mysql需要创建一张mega_wechat_template表,详细结构由下一章节介绍
第三步 
 安装swoole扩展前必须保证系统已经安装了下列软件
php-5.3.10 或更高版本
gcc-4.4 或更高版本
make
autoconf
下载地址 
 https://github.com/swoole/swoole-src/releases 
 http://pecl.php.net/package/swoole 
 http://git.oschina.net/matyhtf/swoole
下载源代码包后,在终端进入源码目录,执行下面的命令进行编译和安装
cd swoole
phpize ./configure
make
make install
服务端对Mysql的依赖
在Mega-wechat的服务端里对微信模板做了存储。这是因为大部分的业务需要经常修改模板的内容,对于这些经常需要改变的模板,如果写死到程序里是非常的不方便,所以利用了MySql存储模板和额外添加了一些业务需要的字段。 
 
对于服务端而言启动时会对数据库的模板进行缓存,若需要更新模板也有相应的命令实时更新服务端的模板缓存,因此不需要担心每次发送模板时都需要从数据库中获取模板造成性能下降的问题。

                  
                  
                  
                  
最低0.47元/天 解锁文章
                          
                      
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					5917
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            