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;
    }
}

 

posted @ 2020-08-21 14:49  摩尔迦娜  阅读(122)  评论(0)    收藏  举报