spring-data-redis實現跨系統消息發佈訂閱,異步解耦

簡述

1.目前有很多系統業務都非常繁雜,傳統模式舉例–客戶新註冊賬號,步驟如下:

1.1 保存表單,插入數據庫,此時客戶註冊的身份已經存在系統中 ;《客戶比較關心事情》
1.2 調用信息中臺<另外的系統>接口,發送郵件通知,或者發送其他消息通知;《客戶不關心的事情》
1.3 other;《客戶不關心的事情》
上述 1~3步都是同步執行(有可能有很多步驟),客戶註冊界面要等所有步驟執行完才收到註冊成功通知,假如某個步驟出錯,則有可能導致註冊失敗(具體要看設計這個程序的人怎麼做),此時客戶的體驗就會非常不好。
那麼換一種方式:假如步驟1.1完成後就返回註冊成功通知,客戶就能直接進入系統,而且同時1.2~以後的步驟後臺異步處理,不影響客戶登錄系統正常使用,這種體驗是不是更好呢?

廢話不多說,進入主題

以下例子的使用環境:
1.spring-boot 2.1.6
2.spring-boot-starter-data-redis 2.1.6
3.系統A,系統B,使用同一個redis服務器。
4.系統A爲發佈者,系統B爲訂閱者(消費者)
引入依賴:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis

	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.1.6.RELEASE</version>
    </dependency>
系統A的代碼

在你需要發送消息的業務方法中,調用以下方法 sendMsgToRedis

	@Autowired
    private StringRedisTemplate stringRedisTemplate;
	/**
     * 發佈消息 
     * @param topic
     * @param object
     */
    public void sendMsgToRedis(String topic, Object object) {
        stringRedisTemplate.convertAndSend(topic, object);
    }
系統B的代碼
/**
 * 說明:
 * redis 消息監聽配置
 * @author wangxingquan
 **/
@Component
public class RedisListenerConfig {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private SyncDocumentService syncDocumentService;
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //下面的topic與系統A
        container.addMessageListener(listenerAdapter, new PatternTopic(RedisMsgType.REDIS_DOCUMENT_SYNC_TOPIC.getRedisKey()));
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter() {
        //使用下面service中的handleMessage
        return new MessageListenerAdapter(syncDocumentService, "handleMessage");
    }

}
//SyncDocumentService 中的handleMessage方法定義:
@Service
public class SyncDocumentService {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    public void handleMessage(String jsonStr) {
        logger.info("文檔同步消息訂閱頻道有新消息進來,參數:{}", jsonStr);
        logger.info(jsonStr);
        //開始處理同步業務邏輯
    }
}
測試結果

系統A發佈:

String json = JSONObject.toJSONString(idList);
            logger.info("開始往redis頻道發送消息...");
            redisService.sendMsgToRedis(ConstantRedis.REDIS_SCHEDULE_QUEUE_KEY.SEND_DOCUMENT_SYNC_SERVICE.key, json);
            logger.info("往redis頻道發送消息成功...");

系統B接收結果:
在這裏插入圖片描述
消息傳遞和接收成功,接下來就是邏輯的處理了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章