场景:系统被分为两大服务,用户服务模块(A)、订单系统服务(B)。下单后给用户返积分。两个系统分管各自的数据库。
方案一:该方案属于最终一致性类型。主要分两个点——消息发送端保证消息能够成功的发出去、消息接受端保证接受到消息后能顺利的处理消息。操作思路:1、消息发送端:在本地服务建立一个记录发送消息的表。在用户下单的同时在表中插入一条记录标识为待发送的消息。将消息发送到消息队列,并将表中的状态修改为已经发送。2:消息接收端:在本地服务中建立一张消息处理日志表。接收到消息后,判断是否已经在消息处理日志表中存在,如果不存在处理消息。给用户添加积分同时在消息处理日志表中插入一条记录,删除消息队列中的此条消息。
伪代码:
<?php
//消息发送者
begin transaction:
$res1 = insert into order set order_id='1',user_id=2,status = '0';
$res2 = insert into message set message_id=order_id,message_content=order;
if($res1 && $res2){
commit;
$res = $sendMessage($order);
if($res == true){
update message set status = 1;
}
}else
roll back;
<?php
//消息接收者
$message = getMessage();
begin transaction:
$res = update user set jifen=jifen + 100 where id=user_id;
$res2 = insert into message_log set message=message,id=message_id;
if($res && $res2){
commit;
deleteMessage($message_id);
}else{
roll back;
}
同时分别开两个后台脚本去定时扫描消息记录表,如果有待发送的消息立即处理!
http://www.cnblogs.com/soundcode/p/5590710.html