我有一个简单的过程,我需要处理表的记录,理想情况下运行多个进程的实例,而不处理相同的记录。我已经与MySQL这样做的方式是相当普遍的(虽然我认为令牌场更加黑客攻击的):PostgreSQL表上并行进程
添加几个字段的表:
CREATE TABLE records (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
...actual fields...
processed_at DATETIME DEFAULT NULL,
process_token TEXT DEFAULT NULL
);
然后一个简单的处理脚本:
process_salt = md5(rand()) # or something like a process id
def get_record():
token = md5(microtime + process_salt)
db.exec("UPDATE records SET process_token = ?
WHERE processed_at IS NULL LIMIT 1", token)
return db.exec("SELECT * FROM records WHERE token = ?", token)
while (row = get_record()) is valid:
# ...do processing on row...
db.exec("UPDATE records SET processed_at = NOW(), token = NULL
WHERE id = ?", row.id)
我在一个使用PostgreSQL数据库的系统中实现这样一个过程。我知道Pg可以被认为比MySQL更成熟,关于MVCC锁定问题 - 我可以在Pg中使用行锁定还是其他功能,而不是令牌字段?
是的,这种方法总是觉得像用锤子敲钉子 - 我一直想看看ZeroMQ很长一段时间,所以我会走这条路。感谢您的洞察! – Ross 2013-04-11 20:08:57