加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

微处事架构:操作变乱驱动实现最终同等性

发布时间:2019-10-13 09:03:18 所属栏目:建站 来源:老男孩的成长之路
导读:事宜同等性 起首,我们往返首一下ACID原则: Atomicity:原子性,改变数据状态要么是一路完成,要么一路失败 Consistency:同等性,数据的状态是完备同等的 Isolation:断绝线,纵然有并发事宜,相互之间也不影响 Durability:耐久性, 一旦事宜提交,不行

2、库存处事在监听到动静行列OrderCreated中的动静,将库存表中商品的库存减去下单数目,然后再发送一个Stock Locked变乱给动静行列。

微处事架构:操作变乱驱动实现最终同等性

代码:

  1. /** 
  2.  * 吸取下单动静 
  3.  * @param message 吸取到的动静 
  4.  * @param session 上下文 
  5.  */ 
  6. @JmsListener(destination = ORDER_CREATE,containerFactory = "myListenerContainerFactory") 
  7. @Transactional(rollbackFor = Exception.class) 
  8. public void receiveOrderCreatedMsg(Message message, Session session){ 
  9.  try { 
  10.  if (message instanceof ActiveMQObjectMessage){ 
  11.  MqStockMsg result = new MqStockMsg(); 
  12.  ActiveMQObjectMessage objectMessage=(ActiveMQObjectMessage)message; 
  13.  MqOrderMsg msg = (MqOrderMsg)objectMessage.getObject(); 
  14.  Integer updateCount = stockMapper.updateNumByStockId(msg.getStockId(),msg.getGoodCount()); 
  15.  if (updateCount >= 1){ 
  16.  result.setSuccess(true); 
  17.  result.setOrderId(msg.getId()); 
  18.  }else { 
  19.  result.setSuccess(false); 
  20.  } 
  21.  // 手动ack,使动静出行列,否则会不绝斲丧 
  22.  message.acknowledge(); 
  23.  // 发送库存锁定动静到MQ 
  24.  jmsProducer.sendStockLockedMsg(result); 
  25.  } 
  26.  } catch (JMSException e) { 
  27.  log.error("吸取订单建设动静报错:"+e.getMessage()); 
  28.  } 

细心的伴侣也许会看到:message.acknowledge(),即手动确认动静。由于在担保库存处事的逻辑能正常执行后再确认动静已斲丧,可以担保动静的投递靠得住性,万一在库存处事执行时报出非常,我们可以做到从头斲丧该下单动静。

3、订单处事吸取到Stock Locked变乱,将订单的状态改为“已确认”

微处事架构:操作变乱驱动实现最终同等性

代码:

  1. /** 
  2.  * 判定是否尚有库存,有库存更新订单状态为1,无库存更新订单状态为2,而且关照用户(WebSocket) 
  3.  * @param message 
  4.  */ 
  5. @JmsListener(destination = STOCK_LOCKED,containerFactory = "myListenerContainerFactory") 
  6. @Transactional(rollbackFor = Exception.class) 
  7. public void receiveStockLockedMsg(Message message, Session session){ 
  8.  try { 
  9.  if (message instanceof ActiveMQObjectMessage){ 
  10.  ActiveMQObjectMessage objectMessage=(ActiveMQObjectMessage)message; 
  11.  MqStockMsg msg = (MqStockMsg)objectMessage.getObject(); 
  12.  if (msg.isSuccess()){ 
  13.  Order updateOrder = new Order(); 
  14.  updateOrder.setId(msg.getOrderId()); 
  15.  updateOrder.setOrderStatus(1); 
  16.  orderMapper.updateByPrimaryKeySelective(updateOrder); 
  17.  log.info("订单【"+msg.getOrderId()+"】下单乐成"); 
  18.  }else { 
  19.  Order updateOrder = new Order(); 
  20.  updateOrder.setId(msg.getOrderId()); 
  21.  updateOrder.setOrderStatus(2); 
  22.  orderMapper.updateByPrimaryKeySelective(updateOrder); 
  23.  // 关照用户库存不敷,订单被打消 
  24.  log.error("订单【"+msg.getOrderId()+"】因库存不敷被打消"); 
  25.  } 
  26.  // 手动ack,使动静出行列,否则会不绝斲丧 
  27.  message.acknowledge(); 
  28.  } 
  29.  } catch (JMSException e) { 
  30.  log.error("吸取库存锁定动静报错:"+e.getMessage()); 
  31.  } 

同样,这里我们也是会操作手动确认动静来担保动静的投递靠得住性。

至此,已经所有搞定了。我们看一下和正常的处事挪用对好比何:

1、订单处事不再直接依靠于库存处事,而是将下单变乱发送到MQ中,让库存监听。

2、订单处事能真正的作为一个模块独立运行。

3、办理了并发题目,并且MQ的行列处理赏罚服从很是的高。

可是也存在下面的题目:

1、用户体验改变了:由于行使变乱机制,订单是当即天生的,然则很有也许过一会,体系会提示你没货了。。这就像是列队抢购一样,排着排着就被关照没货了,不消再列队了。

2、数据库也许会存在很对没有完成下单的订单。

最后,假如然的要思量用户体验,而且不想数据库存在许多不须要的数据,该怎么办?

那就把订单处事和库存处事聚合在一路吧。办理当前的题目该当是起主要思量的,我们计划微处事的目标是本想是办理营业并发量。而此刻面对的却是用户体验的题目,以是架构计划也是必要妥协的。

最首要是,我们是颠末思索和说明的,每个方案能做到哪种水平,能应用到哪种场景。正所谓,技能要和现实场景团结,我们不能为了追求新技能而生搬硬套。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读