0%

1.引言

Beanstalkd 是单进程的,同时也是单线程的。仔细留意一下就会发现很多高性能网络框架都是单进程的和异步的。单线程就避免了 context switch 的开销,而异步是任何高性能系统都会采用的一种架构。我们今天看一下 Beanstalkd 的框架是怎么样的?

Read more »

引言

简单地说:beanstalk 和常规的消息队列比起来最大的特点是支持延时任务处理。类似 Kafka 中的 topic,beanstalk 中叫做 tube。消息的分发模式可以认为是有且仅有一次。关于 beanstalkd 的更多细节可以参考我 之前的文章《beanstalk初探》

Read more »

如何写出扩展性好的代码?这是我工作最近半年来一直在考虑的问题。不管自己做一套系统还是接手别人的项目,只要你的项目需要和别人交互,这个问题都是需要考虑的。我们今天只说说如何写出扩展性好的函数代码。代码都以golang示例。

函数声明

函数声明首先是函数名字要具有自解释性,这个要说到代码注释了,这里就不赘述了。除了函数声明外,还有函数的形参定义。这里以一个例子来说一下扩展性好的函数的参数应该如何定义。

Read more »

上一篇文章说了golang的互斥锁(Mutex)的实现,今天来看看读写锁(RWMutex)的实现。

读写锁是什么

下面是来自维基百科的解释

In computer science, a readers–writer (RW) or shared-exclusive lock (also known as a multiple readers/single-writer lock[1] or multi-reader lock[2]) is a synchronization primitive that solves one of the readers–writers problems. An RW lock allows concurrent access for read-only operations, while write operations require exclusive access. This means that multiple threads can read the data in parallel but an exclusive lock is needed for writing or modifying data. When a writer is writing the data, all other writers or readers will be blocked until the writer is finished writing.

Read more »

上一篇文章 中我提到了锁,准确地说是信号量(semaphore, mutext是semaphore的一种)的实现方式有两种:wait的时候忙等待或者阻塞自己。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//忙等待
wait(S) {
while(S<=0)
; //no-op
S--
}
//阻塞
wait(semaphore *S) {
S->value--;
if (S->value < 0) {
add this process to S->list;
block()
}
}
Read more »

再说锁之前,需要先说一下进程间通信。

1. 进程间通信(Inter Process Communication, IPC)

竞争条件

多个进程(线程)通过共享内存(或者共享文件)的方式进行通信就会出现竞争条件。竞争条件的意思是说两个或者多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序。下面用一个golang程序来模拟一下。

Read more »

上一篇文章介绍了beanstalk的特点,并用go语言写了个简单的demo。但是在实际开发中这么写代码肯定是不行的,因为要考虑扩展性,比如之后beanstalk增加tube以及不同的任务处理函数。我们下面就实现一种非常简单的任务调度系统框架。其实不光是beanstalk,几乎所有的消息队列都需要考虑这些问题。

Read more »

beanstalk是什么

Beanstalk是一个轻量级的消息队列,典型的类Memcache设计,协议和使用方式都是同样的风格。Beanstalk的应用场景主要有:

  1. 消息异步处理,这个和其他消息队列没有区别。
  2. 消息延迟处理,类似crontab,比crontab优点是支持并发。
Read more »

引言

fasthttp是一个非常优秀的web server框架,号称比官方的net/http快10倍以上。fasthttp用了很多黑魔法。俗话说,源码面前,了无秘密,我们今天通过源码来看一看她的goroutine pool的实现。

Read more »

引言

在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法。为了感受更深一点,我们来看一下go的源码。先定义一个最简单的http server如下。

1
2
3
4
5
6
7
8
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello there!\n")
}

func main(){
http.HandleFunc("/", myHandler) // 设置访问路由
log.Fatal(http.ListenAndServe(":8080", nil))
}
Read more »