1.引言
Beanstalkd 是单进程的,同时也是单线程的。仔细留意一下就会发现很多高性能网络框架都是单进程的和异步的。单线程就避免了 context switch 的开销,而异步是任何高性能系统都会采用的一种架构。我们今天看一下 Beanstalkd 的框架是怎么样的?
abc
简单地说:beanstalk 和常规的消息队列比起来最大的特点是支持延时任务处理。类似 Kafka 中的 topic,beanstalk 中叫做 tube。消息的分发模式可以认为是有且仅有一次。关于 beanstalkd 的更多细节可以参考我 之前的文章《beanstalk初探》 。
上一篇文章说了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.
上一篇文章 中我提到了锁,准确地说是信号量(semaphore, mutext是semaphore的一种)的实现方式有两种:wait的时候忙等待或者阻塞自己。
1 | //忙等待 |
上一篇文章介绍了beanstalk的特点,并用go语言写了个简单的demo。但是在实际开发中这么写代码肯定是不行的,因为要考虑扩展性,比如之后beanstalk增加tube以及不同的任务处理函数。我们下面就实现一种非常简单的任务调度系统框架。其实不光是beanstalk,几乎所有的消息队列都需要考虑这些问题。
在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法。为了感受更深一点,我们来看一下go的源码。先定义一个最简单的http server如下。
1 | func myHandler(w http.ResponseWriter, r *http.Request) { |