Memcache在微信中的应用

2015-11-08 07:48胡毅,蒋志初
计算机与网络 2015年17期
关键词:响应速度消息服务器

Memcache在微信中的应用

一、微信应用开发特点和memcache的特点

近些年来微信的风靡让使用微信API接口开发的微应用的需求大幅增长。在这些应用的开发过程中往往发现,因微信特殊交互方式导致和传统的WEB应用开发有所不同。微信公众平台官网的解释是:公众平台开发接口提供与用户进行消息交互、自定义菜单交互的能力。对于已接入的第三方接口,当用户发送消息时,微信会推送至第三方服务器。以上就是微信公众平台的开发流程,很多人因不明白而使开发受阻,如图所示。

用户主动发送的消息分成普通消息、事件消息、语音识别结果。普通消息包含文本、图片、语音、视频、位置、链接等多维度消息,也是开发者们最常用的。事件消息包含关注、取消关注、扫描二维码参数、上报地理位置、自定义菜单(点击、跳转)监控等。整个消息按标准XML格式进行传递,所以开发人员可以用任何语言进行代码开发。

在微信应用中遇到的问题

1、响应速度

微信服务器在于第三方开发的应用交互工程中在微信服务器发出消息后五秒内收不到响应会断掉连接,否则微信都会在公众号会话中向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”的交互失败信号。在一些大用户量的微信应用中对响应速度的要求比普通的WEB应用要高的多。所以如何在开发微信应用中提高其响应速度就成了我们应该关注的问题。为了得到应用的高响应性能,如何减少应用运行中命中数据库的次数成为了关键。

2、用户会话状态

在开发微信的应用的时候我们经常会遇到需要保持或处理用户会话状态的需求(比如:用户登录状态、用户信息的共享等),因为微信应用的HTTP交互和传统的BS结构不同,它不是用户的浏览器与服务器的直接连接,而交互的双方是微信服务器和第三方服务器,所以不存在不同用户会话状态,这就是传统的WEB应用中用过Session和Cookies处理的用户会话状态的方法统统失效了,我们就需要寻找其他的方法来解决这个问题。

3、临时性数据的存储

在微信应用开发过程中我们经常需要存取一些访问频繁的临时数据(如:access_token),为了保证应用的响应速度需要寻找一种高效存取方式。

Memcache在微信应用中的问题解决的方法

1、Memcache特性就是决定了它是降低应用的数据库命中次数,提高HTTP应用响应效率的好方法。

按应用场景的不同一般有以下两种设计方案:

方案一:把数据库的SQL查询结果缓存到memcache,读取数据的时候优先从memcached读取,挡住数据库查询请求。方案二:把业务处理的最终结果进行缓存,客户端来请求时可以直接返回这个缓存的结果。

2、在解决微信用户会会话状态的时,可以把用户会话信息(如:用户ID,登录状态等数据)以OPENID为唯一键值以key->value的形式存储在memcache服务器中,需要时以OPENID为标记取出存储值。代码样例如下:

应当注意的是虽然在单一的微信公共号中openid是与用户账号一一对应的,但如果是开发跨不同的微信公共号的应用中用户的openid就会发生变化,不能做到一一对应了。

3、对于存取访问频繁的临时性数据使用memcache应该是非常合适的方法了。我们以存取access_token为例。access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。一般的公共号每天获取access_token的次数是有限的,过度频繁的调用获取接口可能会因达到每天接口调用次数的上限而导致应用无法正常运行,所以我们尽可能的每次获取access_token后使用到过期再去接口申请新的access_token。代码样如下:

为了达到最佳的缓存效果,我们在设计Memcache的缓存更新策略时候要考虑应用场景的特点设计缓存更新策略。两种常见的方案:

方案一:懒惰式加载,客户端先查询memcached,如果命中,返回结果,如果没命中(没有数据或已经过期),则从数据库中加载最新数据,并写回到memcached中,最后返回结果。方案二:主动更新策略,缓存里的数据永不失效,当有数据更新的时候,由单独程序来更新这个缓存。

Memcache开发中应注意的几个问题

批量读取(multiget):有些较复杂的业务请求可能一次请求要进行多次memcached操作,其中的网络往返的消耗以及对memcached节点施加的并发压力还是比较可观的,这种情况下我们可以考虑进行批量读取来减少网络io往返的次数,一次把数据返回,同时还能减轻客户端的业务处理逻辑。

改变系列化方式:不用编程语言自带的对象序列化方式,自己序列化,把要缓存的对象序列化成字节数组或者string进行保存。这样在内存节省和网络传输上都有不错的效果。

增长因子:合理调整memcached的增长因子,可以有效控制内存的浪费。

空结果的处理:有些场景下我们数据库里没有查到数据,缓存里也是空的,这时候需要在缓存里存放一个短时效的空结果来挡住前端的频繁请求,以免对数据库造成压力。

memcache的使用其实非常简单,性能也很出色,上面这些就是我们在微信应用开发中会碰到的一些场景和问题,使用memcache解决这些问题可以给以后的开发维护带来不少便利。

(中国江苏网胡毅蒋志初)

猜你喜欢
响应速度消息服务器
Kubernetes容器集群环境下新型供电系统响应速度优化
基于高速相位调制器的超快偏振控制
一张图看5G消息
通信控制服务器(CCS)维护终端的设计与实现
电磁阀响应速度的影响因素
中国服务器市场份额出炉
得形忘意的服务器标准
计算机网络安全服务器入侵与防御
消息
消息