goworker源码解析

前段时间了解过resque,最近在学go,找了几个简单的go的项目看了看源码,正好看到goworker,项目背景熟悉,所以就研究了下具体的逻辑。

goworker is a Go-based background worker that runs 10 to 100,000* times faster than Ruby-based workers.
goworker项目地址:goworker

Resque is a Redis-backed Ruby library for creating background jobs, placing them on multiple queues, and processing them later.
resque项目地址:resque

继续阅读“goworker源码解析”

Elasticsearch的使用

随着公司业务的增长,我们渐渐积累了很多的业务数据,其中包括应用程序的日志和业务相关的日志,在此之前,我们通常都是将日志定时打包然后同步到一台磁盘够大的机器,也或者直接推给数据平台使用Hadoop集群算一些统计数据。然后有时候我们的业务需要实时地去查找一些日志,或者实时地统计一些数据。所以在已有的hadoop集群下,我们搭建了一个Elasticsearch集群,来存储关键日志并提供搜索查询。
继续阅读“Elasticsearch的使用”

PHP Redis是使用connect还是pconnect

现在不管是在缓存方面,还是NoSQL方面,Redis很火也很流行,但是使用方面的经验不是很多,包括Redis的一些优化配置,还有使用Redis的一些技巧和经验都没有一个官方的指导,所以在网上能搜索到很多相关的东西,但是发现不一定完全匹配自己遇到的一些问题,而且有的文章只是告诉你要这么做,但是没有深究到底是为什么?

最近碰到一个项目的优化,该项目其实逻辑很简单,大的结构就是处理用户的请求,然后读Redis,返回对应的数据。而问题的所在在于该项目有个特点,就是存在整点效应——平时访问量比较低,服务器压力不大,但是整点的时候并发能够达到平时的4-5倍,服务器完全抗不住。所以我们就慢慢梳理整个项目的架构,还有流程,想从中发现问题的所在。

为了先解决并发高服务器负载过高的问题,我们首先分析了…(话扯远了,背景就介绍到这里,呵呵。。)
继续阅读“PHP Redis是使用connect还是pconnect”

MongoDB集群搭建[记录]

这段时间正好在做业务架构的调整,由于用户量持续的增长,原有的Mysql(AWS RDS)扩展也比较麻烦,对于分库分表需要业务代码的调整或者增加中间件(DBProxy),而且我们的业务也没有要求事务性,所以考虑采用Nosql数据库。其中有几点我们比较关注的:

1、Schema-free.大家用过Mysql或关系型数据的都知道,当数据量很大的时候对于表结构的修改会头疼的。

有相关的中间件在Mysql上层,可以做到Schema-free。

2、良好的横向扩展性。无需任何修改,添加机器自动可以扩容,分布式集群的特性。

也有相关的中间件在Mysql上层,或D-Mysql。

3、复杂的查询和统计相关的查询,能够更快的得到查询数据。

Mysql本身不支持,但可以通过其他服务实现,比如Solr ES等等。

当然,Mongodb是要烧内存的,Mysql将所有的数据缓存到内存查询性能也很强筋,换成SSD也会提高性能。

Mongodb也占用更多的磁盘空间,会有很多碎片存在。因为是Schema-free,所以数据保存的同时字段也需要保存,所以它是BSON格式存储。

继续阅读“MongoDB集群搭建[记录]”

服务降级的处理

       消息中间件:所有服务调用可以使用消息中间件进行控制
       前端页面:指定网址不可访问(NGINX+LUA)
       底层数据驱动:拒绝所有增删改动作,只允许查询

用Redis做简单的任务队列

队列本身其实是个有序的列表,而Redis是支持list的,我们可以查看Redis的官方文档 http://redis.io/commands#list,其中我们可以对这个队列的两端分别进行操作,所以其实Redis中的list即可以当做普通的先进先出的queue,也可以作为先进后出的stack。

如果当做队列来用,我们可以用LPUSH(头部插入)和RPOP(尾部弹出)或RPUSH(尾部插入)和LPOP(头部弹出),这两种方式都可以,只要是搭配使用即可。但我们平时一般搭配使用 LPUSH和RPOP。

继续阅读“用Redis做简单的任务队列”