RocketMQ初接触
https://blog.csdn.net/qq_38550836/article/details/98945267
这篇记录挺清晰的
nameserver起的一个协调,注册中心的作用,
broker记录了消息的commitlog,comsumeQueue,其中commitlog中有消息消费进度的offset,
broker有主从结构,支持同步复制跟异步复制,异步复刻如果主节点挂掉,可能造成消息的丢失。
还支持同步刷盘跟异步刷盘,就是指把消息从内存中写入到磁盘内,这种一般异步刷盘就可以,如果主节点挂掉,还有从节点可以保证数据不丢失。
---------------------------------------------------------------------------------
事务消息,先从Producer发一个事务消息到broker,同时并行的会在Consumer处理业务消息,这时消息在broker是对Consumer不可见状态,
等Producer业务处理完了,提交事务,通知broker这条消息可以进行发送了,这时Consumer才会去消费这条消息,
broker在这个等待过程中,也会不断的回查Producer,由Producer判断业务到底成没成功,保证了消息的准确可靠投递。
在Consumer则去需要对消息进行去重幂等性处理。
贴个从别人那拷来的代码,写的还是比较清楚的。
https://blog.csdn.net/Aqu415/article/details/100835351
public class TransactionListenerImpl implements TransactionListener { private AtomicInteger transactionIndex = new AtomicInteger(0); private ConcurrentHashMap<String, Integer> localTrans = new ConcurrentHashMap<>(); //这个方法会在client端发送完消息后根据消息发送的结果调用,是被client端自己调用的; //这个方法被执行,表示client与broker之间是网络畅通的,该方法主要编写的功能是完成本地事务的处理 @Override public LocalTransactionState executeLocalTransaction(Message msg, Object arg) { int value = transactionIndex.getAndIncrement(); int status = value % 3; localTrans.put(msg.getTransactionId(), status); return LocalTransactionState.UNKNOW; } //这个方法是broker在超时后主动调用的,用于检查本地事务是否已经完成,brokerg根据返回值决定是否需要投递消息 @Override public LocalTransactionState checkLocalTransaction(MessageExt msg) { Integer status = localTrans.get(msg.getTransactionId()); if (null != status) { switch (status) { case 0: return LocalTransactionState.UNKNOW; case 1: return LocalTransactionState.COMMIT_MESSAGE; case 2: return LocalTransactionState.ROLLBACK_MESSAGE; } } return LocalTransactionState.COMMIT_MESSAGE; }
}

浙公网安备 33010602011771号