~ 为偷懒而艰苦思考ing (powered by rst2S5)
Authors: | Zoom.Quiet |
---|---|
URL: | http://zoomquiet.org/res/s5/111111-pyconchina-mq-taste |
参考所有同好行为总结而得
被 开发
实体
应用一系列 代码/数据 集合构成
- 实体代表了分离的数据系列(disjoint sets of data)
- 每个数据项(datum)只位于一个实体中
- 实体中的数据决不与其它实体的数据交叉(overlap)
考虑实体的:
- 分离的序列化范围 Disjoint Scopes of Serializability
- 唯一标识的实体 Uniquely Keyed Entities
- 重分区和实体 Repartitioning and Entities
- 原子事务和实体 Atomic Transactions and Entities
应用程序底层将确保每个实体键值(和实体)位于单一的机器(或群集)上,而不同实体则可能分布在任何地方
实体是操作原子性的边界标志
鲁棒
分层
范畴
全局事务序列化(global transactional serializability)
- 2PC(两阶段提交)在某节点不可用时容易阻塞
- 协议例如Paxos算法,在节点失败时不会阻塞
- 现在考虑的是非全局事务
- 多个分离的事务序列化范围(multiple disjoint scopes of transactional serializability)
幂等
识别出所有实体后
明确各级原子性的事务来:
- 安全且幂等: 读取
- 安全不幂等: 查询/修订
- 幂等不安全: 创建
- 不安全幂等: 删除
避免: 消息重试(retry)和重新订阅(reorder)
MOP
now = datetime.datetime.now()
difference = datetime.timedelta(seconds=10)
timeout = now - difference
queue.find({'inProg' : True, 'start' : {'$lte' : timeout} })
from karait import Message, Queue
queue = Queue(
database='karait',
queue='messages',
)
queue.write({
'name': 'Benjamin',
'action': 'Rock'
}
,routing_key='foobar'
)#, expire=3.0
from karait import Message, Queue
queue = Queue()
message = queue.read()[0]
print "%s" % (message.name)
message.delete()
var puts = require('sys').puts,
Queue = require('karait').Queue;
new Queue(function(err, queue) {
(function readMessages() {
queue.read({routingKey: 'foobar'}, function(err, messages) {
for (var i = 0, message; (message = messages[i]) != null; i++) {
//...
}
queue.deleteMessages(messages, function() {
readMessages();
});
})();
});
require 'karait'
queue = Karait::Queue.new
message = queue.read().first
print "#{message.name}"
message.delete
from karait import Message, Queue
queue = Queue()
message = queue.read(routing_key='foobar',
visibility_timeout=3.0)[0]
print "%s" % (message.name)
message.delete
进程
监控
ip:port:start_time:pid 为组合,对进程进行标识:
- pid 确保唯一性
- gpid 生成成本低
- gpid 有生产意义
- gpid 有历史意义