分布式系统如何保证数据一致性

场景:系统被分为两大服务,用户服务模块(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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值