qmq
qmq copied to clipboard
发送消息时,不发送对象的设计和折衷是什么?
我想传递订单信息,需要一个一个写order的属性,如果传递整个对象,需要通过序列化来变通,请问为什么不提供直接发送对象消息的设计呢? 如下所示.
public void placeOrder(Order order){
//bussiness work
log.info("order:{}",order.toString());
Message message = producer.generateMessage("order.changed");
message.setProperty("orderNo", order.getOrderNo());
message.setProperty("orderTime", order.getOrderTime());
message.setProperty("uid", order.getUid());
// 发送对象,需要自已序列化变通一下
message.setProperty("order",new Gson().toJson(order));
producer.sendMessage(message);
}
QMQ最开始的定位是用于业务中的消息中间件,在业务使用中我们并不推荐将所有数据都通过消息来传递,这往往会导致时序等问题,我们更推荐使用消息传输一些关键信息,而消费方使用这些关键信息查询到最新信息。
举一个例子,假设我们在订单系统中使用消息来发送订单变更事件,如果将订单所有信息都放在消息里,这样消息消费方在收到消息后因为具备所有他需要的消息很有可能就会拿这些消息去做业务处理,而订单可能有多个不同的变更方,这样一来很有可能消费方使用消息里的订单数据时订单已经发生了变更,那么消费方就使用了一个错误的数据来处理,我们这个时候更推荐消费方使用比如订单号去查询到最新版本的订单。
所以这种使用key/value的方式设置消息的API是我们有意为之。
感觉中间件不应该关心业务具体如何使用的问题啊,中间件只需要透传消息就可以了