成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

發(fā)件箱模式:打造微服務(wù)可靠消息傳輸

開發(fā) 系統(tǒng)
本文介紹了在微服務(wù)系統(tǒng)中實(shí)現(xiàn)可靠消息傳遞以及分布式事務(wù)的發(fā)件箱模式,該設(shè)計(jì)模式實(shí)現(xiàn)了消息生產(chǎn)者和消費(fèi)者的解耦,了解這一模式可以幫助我們設(shè)計(jì)出容錯(cuò)性、可靠性更高的系統(tǒng)。

開發(fā)微服務(wù)以及其他分布式系統(tǒng)都不容易,任何問題都有可能發(fā)生,甚至還有關(guān)于這方面的研究論文。

作為工程師,減少出錯(cuò)的可能性也應(yīng)該是你的目標(biāo)之一,本文將嘗試使用發(fā)件箱模式(Outbox pattern) 來實(shí)現(xiàn)這一點(diǎn)。

如何在分布式系統(tǒng)中實(shí)現(xiàn)組件之間的可靠通信?

發(fā)件箱模式是此類問題的一種優(yōu)雅解決方案,該方案讓我們能夠?qū)崿F(xiàn)事務(wù)性保證,并至少向外部系統(tǒng)傳遞一次消息。

讓我們看看發(fā)件箱模式如何解決這個(gè)問題,以及如何實(shí)現(xiàn)。

發(fā)件箱模式解決了什么問題?

當(dāng)然,要理解發(fā)件箱模式解決了什么問題,我們先給出一個(gè)問題。

下面是一個(gè)用戶注冊流程的示例,有幾件事正在發(fā)生:

  • 將 User 保存到數(shù)據(jù)庫
  • 向 User 發(fā)生歡迎郵件
  • 向消息總線發(fā)布 UserRegisteredEvent
public async Task RegisterUserAsync(User user, CancellationToken token)
{
    _userRepository.Insert(user);

    await _unitOfWork.SaveChangesAsync(token);

    await _emailService.SendWelcomeEmailAsync(user, token);

    await _eventBus.PublishAsync(new UserRegisteredEvent(user.Id), token);
}

所有操作都在常規(guī)路徑中按序完成,沒有任何問題,一切都很好。

但如果其中任何一個(gè)操作失敗了怎么辦?

  • 數(shù)據(jù)庫不可用,保存 User 失敗
  • 郵件服務(wù)中斷,無法發(fā)送郵件
  • 向服務(wù)總線發(fā)布事件沒有成功

另外,想象一下這種情況:你已經(jīng)將 User 保存到數(shù)據(jù)庫中,并向他發(fā)送了歡迎郵件,但未能成功發(fā)布 UserRegisteredEvent 來通知其他服務(wù)。怎么才能從這種情況中恢復(fù)過來?

發(fā)件箱模式可以幫你自動更新數(shù)據(jù)庫并將消息發(fā)送到消息總線。

實(shí)現(xiàn)發(fā)件箱模式

首先在數(shù)據(jù)庫中引入一個(gè)表示發(fā)件箱(Outbox) 的新表,可以將這個(gè)表稱為 OutboxMessages,用于存儲需要傳遞的所有消息?,F(xiàn)在,我們不再直接向外部服務(wù)發(fā)出請求,而是簡單的將消息作為新行存儲在發(fā)件箱表中,消息通常以 JSON 格式存儲。

然后引入后臺進(jìn)程,定期輪詢 OutboxMessages 表。如果發(fā)現(xiàn)有未處理的消息,就發(fā)布該消息并標(biāo)記為已發(fā)送。如果由于某種原因造成消息發(fā)布失敗,就在下一次執(zhí)行時(shí)重試。

注意,通過重試,現(xiàn)在實(shí)現(xiàn)了至少一次消息傳遞(at-least-once message delivery)。對于常規(guī)路徑,消息只發(fā)布一次,而在重試的情況下,則會發(fā)布多次。

我們現(xiàn)在可以基于發(fā)件箱模式重寫上面的 RegisterUserAsync 方法:

public async Task RegisterUserAsync(User user, CancellationToken token)
{
    _userRepository.Insert(user);

    _outbox.Insert(new UserRegisteredEvent(user.Id));

    await _unitOfWork.SaveChangesAsync(token);
}

發(fā)件箱與工作單元在同一個(gè)事務(wù)中,因此可以將 User 自動保存到數(shù)據(jù)庫中,并持久化 OutboxMessage。如果保存到數(shù)據(jù)庫失敗,則回滾整個(gè)事務(wù),并且不會向消息總線發(fā)送任何消息。

由于現(xiàn)在將 UserRegisteredEvent 的發(fā)布轉(zhuǎn)移到了工作進(jìn)程,因此需要添加一個(gè)處理程序,以便向用戶發(fā)送歡迎郵件。下面是 SendWelcomeEmailHandler 類的一個(gè)例子:

public classSendWelcomeEmailHandler : IHandle<UserRegisteredEvent>
{
    privatereadonly IUserRepository _userRepository;
    privatereadonly IEmailService _emailService;

    public SendWelcomeEmailHandler(
        IUserRepository userRepository,
        IEmailService emailService)
    {
        _userRepository = userRepository;
        _emailService = emailService;
    }

    public async Task Handle(UserRegisteredEvent message)
    {
        var user = await _userRepository.GetByIdAsync(message.UserId);

        await _emailService.SendWelcomeEmailAsync(user);
    }
}

發(fā)件箱模式架構(gòu)圖

下面是引入發(fā)件箱后的系統(tǒng)架構(gòu)圖,可以在數(shù)據(jù)庫中看到 Outbox 表,因此可以將消息與相關(guān)實(shí)體一起通過同一事物存儲到 Outbox 表中。

延伸閱讀

通過本文,你應(yīng)該對發(fā)件箱模式以及它解決的問題有了很好的理解。如果需要在分布式系統(tǒng)中實(shí)現(xiàn)可靠消息傳遞,那么發(fā)件箱模式是一個(gè)很好的解決方案。

如果需要了解發(fā)件箱模式的更多實(shí)現(xiàn)細(xì)節(jié),可以觀看以下油管視頻:

責(zé)任編輯:趙寧寧 來源: DeepNoMind
相關(guān)推薦

2023-01-07 10:17:06

微服務(wù)架構(gòu)模式

2025-06-04 08:10:00

發(fā)件箱模式.NET數(shù)據(jù)庫

2021-05-06 10:12:14

鴻蒙HarmonyOS應(yīng)用

2019-07-26 08:00:00

微服務(wù)架構(gòu)

2016-09-23 10:51:23

騰訊云

2021-06-16 08:33:02

分布式事務(wù)ACID

2022-07-21 06:54:28

微服務(wù)系統(tǒng)RocketMQ

2023-07-25 09:52:00

本地事務(wù)宕機(jī)

2024-10-10 08:34:34

事務(wù)外包模式

2023-09-07 23:25:34

微服務(wù)服務(wù)發(fā)現(xiàn)

2023-09-02 20:51:09

微服務(wù)業(yè)務(wù)服務(wù)

2009-11-05 09:51:14

WCF基礎(chǔ)

2022-07-13 13:34:30

微服務(wù)邊車SideCar

2017-08-10 15:38:02

互聯(lián)網(wǎng)

2012-05-24 13:39:11

Python

2009-01-03 11:07:06

AJAXASP.NET.NET

2018-12-11 22:13:28

黑少

2009-01-03 16:29:45

AJAXASP.NET.NET

2015-05-04 14:12:43

2010-07-02 09:24:22

云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久久久久238 | 日韩欧美在线视频 | 中文字幕av网站 | 中文字幕一区二区三区四区 | 免费在线观看av的网站 | 午夜精品久久久久久久久久久久 | 亚洲成人精品一区 | 欧美精品在线免费观看 | 中文字幕亚洲视频 | 成年人网站免费视频 | 亚洲高清一区二区三区 | 欧美伊人影院 | 看黄在线 | 国产视频第一页 | 欧美成人高清视频 | 一区二区三区视频在线 | 亚洲人在线 | 精品国产精品 | 亚洲国产精品一区 | 久久亚洲天堂 | 婷婷在线免费 | 男人天堂手机在线视频 | 一区二区三区在线免费观看 | 久久69精品久久久久久久电影好 | 欧美在线a | 久久精品视频一区二区 | 国产成人精品一区二区三区视频 | 天天躁日日躁狠狠的躁天龙影院 | 又爽又黄axxx片免费观看 | 国产一区二区久久 | 嫩草国产| 波波电影院一区二区三区 | 亚洲天堂av网 | 亚洲精品一区二区 | 伊人免费观看视频 | 欧美一区二区在线观看 | 男女网站免费观看 | 欧美一区二区三区四区在线 | 九色av| 久久久人成影片免费观看 | 欧美2区|