2014年2月21日

RabbitMQ消息队列(五):Routing 消息路由

摘要: 上篇文章中,我们构建了一个简单的日志系统。接下来,我们将丰富它:能够使用不同的severity来监听不同等级的log。比如我们希望只有error的log才保存到磁盘上。1. Bindings绑定 上篇文章中我们是这么做的绑定:channel.queue_bind(exchange=exchange_name, queue=queue_name) 绑定其实就是关联了exchange和queue。或者这么说:queue对exchagne的内容感兴趣,exchange要把它的Message deliver到queue中。 实际上,绑定可以带routing_key... 阅读全文

posted @ 2014-02-21 20:04 anzhsoft 阅读(162) 评论(0) 推荐(0) 编辑

RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

摘要: logs_from_rabbit.logConsumer2:打印到屏幕:$ python receive_logs.py接下来,Producer:$ python emit_log.py使用命令rabbitmqctl list_bindings你可以看我们创建的queue。一个output:$ sudo rabbitmqctl list_bindingsListing bindings ...logs exchange amq.gen-JzTY20BRgKO-HjmUJj0wLg queue []logs exchange amq... 阅读全文

posted @ 2014-02-21 19:38 anzhsoft 阅读(172) 评论(0) 推荐(0) 编辑

RabbitMQ消息队列(三):任务分发机制

摘要: <=== RabbitMQ消息队列(二):”Hello, World“ 在上篇文章中,我们解决了从发送端(Producer)向接收端(Consumer)发送“Hello World”的问题。在实际的应用场景中,这是远远不够的。从本篇文章开始,我们将结合更加实际的应用场景来讲解更多的高级用法。 当有Consumer需要大量的运算时,RabbitMQ Server需要一定的分发机制来balance每个Consumer的load。试想一下,对于web application来说,在一个很多的HTTP request里是没有时间来处理复杂的运算的,只能通过后台的一些工作线程来完成。接下来我们分布 阅读全文

posted @ 2014-02-21 17:59 anzhsoft 阅读(158) 评论(0) 推荐(0) 编辑

2014年2月20日

RabbitMQ消息队列(二):”Hello, World“

摘要: easy_install pip> pip install pika==0.9.82. Sending第一个program send.py:发送Hello world 到queue。正如我们在上篇文章提到的,你程序的第一句话就是建立连接,第二句话就是创建channel:#!/usr/bin/env pythonimport pikaconnection = pika.BlockingConnection(pika.ConnectionParameters( 'localhost'))channel = connection.channel()创建连接传入的参数就是... 阅读全文

posted @ 2014-02-20 21:15 anzhsoft 阅读(140) 评论(0) 推荐(0) 编辑

RabbitMQ消息队列(一): Detailed Introduction 详细介绍

摘要: 1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。 RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。 阅读全文

posted @ 2014-02-20 20:13 anzhsoft 阅读(152) 评论(0) 推荐(0) 编辑

2014年2月13日

并发编程入门(三): 使用C++11实现无锁stack(lock-free stack)

摘要: 前几篇文章,我们讨论了如何使用mutex保护数据及使用使用condition variable在多线程中进行同步。然而,使用mutex将会导致一下问题:等待互斥锁会消耗宝贵的时间 — 有时候是很多时间。这种延迟会损害系统的scalability。尤其是在现在可用的core越多越多的情况下。低优先级的线程可以获得互斥锁,因此阻碍需要同一互斥锁的高优先级线程。这个问题称为优先级倒置(priority inversion )。可能因为分配的时间片结束,持有互斥锁的线程被取消调度。这对于等待同一互斥锁的其他线程有不利影响,因为等待时间现在会更长。这个问题称为锁护送(lock convoying)。互斥 阅读全文

posted @ 2014-02-13 20:47 anzhsoft 阅读(380) 评论(0) 推荐(0) 编辑

2014年2月12日

并发编程入门(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题

摘要: 请阅读上篇文章《并发编程实战: POSIX 使用互斥量和条件变量实现生产者/消费者问题》。当然不阅读亦不影响本篇文章的阅读。Boost的互斥量,条件变量做了很好的封装,因此比“原生的”POSIX mutex,condition variables好用。然后我们会通过分析boost相关源码看一下boost linux是如何对pthread_mutex_t和pthread_cond_t进行的封装。首先看一下condition_variable_any的具体实现,代码路径:/boost/thread/pthread/condition_variable.hppclass condition_vari 阅读全文

posted @ 2014-02-12 12:42 anzhsoft 阅读(243) 评论(0) 推荐(0) 编辑

2014年2月10日

并发编程入门(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

摘要: boost的mutex,condition_variable非常好用。但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装。因此通过对原生态的POSIX 的mutex,cond的生成者,消费者的实现,我们可以再次体会boost带给我们的便利。1. 什么是互斥量 互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所以在该互斥锁上的阻塞线程都会变成可进行状态,第一个... 阅读全文

posted @ 2014-02-10 19:57 anzhsoft 阅读(314) 评论(0) 推荐(0) 编辑

2014年1月27日

Linux Debugging(五): coredump 分析入门

摘要: 作为工作几年的老程序猿,肯定会遇到coredump,log severity设置的比较高,导致可用的log无法分析问题所在。 更悲剧的是,这个问题不好复现!所以现在你手头唯一的线索就是这个程序的尸体:coredump。你不得不通过它,来寻找问题根源。 通过上几篇文章,我们知道了函数参数是如何传递的,和函数调用时栈是如何变化的;当然了还有AT&T的汇编基础,这些,已经可以使我们具备了一定的调试基础。其实,很多调试还是需要经验+感觉的。当然说这句话可能会被打。但是你不得不承认,随着调试的增多,你的很多推断在解决问题时显得很重要,因此,我们需要不断积累经验,来面对各种case。 导致core 阅读全文

posted @ 2014-01-27 17:33 anzhsoft 阅读(352) 评论(0) 推荐(0) 编辑

Linux Debugging(四): 使用GDB来理解C++ 对象的内存布局(多重继承,虚继承)

摘要: 前一段时间再次拜读《Inside the C++ Object Model》 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记:Program Transformation Semantics (程序转换语义学)The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)The Semantics of Constructors: The Default Constructor (默认构造函数什么时候会被创建出来)The Semantics of Data: Data语义学 深入探索C++对象模型 这些文章都获得了很大的浏览量. 阅读全文

posted @ 2014-01-27 13:53 anzhsoft 阅读(558) 评论(0) 推荐(0) 编辑

导航