前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ChatGPT视频摘要实战

ChatGPT视频摘要实战

原创
作者头像
用户1758543
发布于 2023-05-09 02:02:53
发布于 2023-05-09 02:02:53
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

随着在 YouTube 上提交的大量新视频,很容易感到挑战并努力跟上我想看的一切。 我可以与我每天将视频添加到“稍后观看”列表中的经历联系起来,只是为了让列表变得越来越长,实际上并没有稍后再看。 现在,像 ChatGPT 或 LLaMA 这样的大型语言模型为这个长期问题提供了一个潜在的解决方案。

通过将数小时的视频内容转换为几行准确的摘要文本,视频摘要器可以快速为我们提供视频的要点,这样我们就不必花费大量时间来完整观看它。 在我创建这个网络应用程序之后,我最常使用的场景是参考它的摘要来决定某个视频是否值得观看,尤其是那些辅导、脱口秀或演示视频。

推荐:用NSDT设计器快速搭建可编程3D场景。

你可以通过多种方式使用强大的语言模型来完成此视频摘要。

  • 一种选择是使用或设计 ChatGPT 插件,它可以将令人难以置信的 AI 连接到实时 YouTube 网站。 但是,只有少数商业开发人员可以访问 ChatGPT 插件,因此这对包括我在内的所有人来说可能不是最可行的途径。
  • 另一种选择是下载视频的抄本(字幕)并将其附加到提示中,然后要求语言模型通过发送提示来总结抄本文本。 然而,这种方法有一个很大的缺点——你不能总结一个包含超过 4096 个标记的视频,这对于一个普通的谈话节目来说通常是 7 分钟左右。
  • 一个更有前途的选择是使用上下文学习技术对转录本进行向量化,并使用向量向语言模型提示“摘要”查询。 这种方法可以生成准确的答案,指示转录文本的摘要,并且不限制视频长度。

如果你有兴趣开发自己的上下文学习应用程序,我之前关于构建聊天机器人以学习和聊天文档的文章提供了一个很好的起点。 通过一些细微的修改,我们可以应用相同的方法来创建我们自己的视频摘要器。 在本文中,我将逐步指导你完成开发过程,以便你了解并复制自己的视频摘要器。

1、框图

在这个Video Summarizer应用程序中,我们以llama-index为基础,开发了一个Streamlit web应用程序,为用户提供视频URL的输入以及屏幕截图、文字记录和摘要内容的显示。 使用 llamaIndex 工具包,我们不必担心 OpenAI 中的 API 调用,因为对嵌入使用的复杂性或提示大小限制的担忧很容易被其内部数据结构LLM 任务管理所覆盖。

你有没有想过为什么我在让 LLM 生成摘要时设计了几个查询而不是一个用于转录文本处理的查询? 答案在于情境学习过程。 当文档被送入 LLM 时,它会根据其大小分成块或节点。 然后将这些块转换为嵌入并存储为向量。

当提示用户查询时,模型将搜索向量存储以找到最相关的块并根据这些特定块生成答案。 例如,如果你在大型文档(如 20 分钟的视频转录本)上查询“文章摘要”,模型可能只会生成最后 5 分钟的摘要,因为最后一块与上下文最相关 的“总结”。

为了说明这个概念,请看下面的图表:

通过设计多个查询,我们可以促使 LLM 生成更全面的摘要,涵盖整个文档。 我将在本文后面更深入地组织多个查询。

从第2章到第5章,我将重点介绍本项目中使用到的所有模块的基础知识和典型用法介绍。 如果你愿意在没有这些技术背景的情况下立即开始编写整个 Video Summarizer 应用程序,建议你转到第 6 章。

2、Youtube 视频转录文本

总结 YouTube 视频的第一步是下载转录文本。 有一个名为 youtube-transcript-api 的开源 Python 库可以完美满足我们的要求。

使用如下命令安装模块后,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install youtube-transcript-api

可以使用以下代码轻松下载 JSON 格式的转录文本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from youtube_transcript_api import YouTubeTranscriptApi
from youtube_transcript_api.formatters import JSONFormatter

srt = YouTubeTranscriptApi.get_transcript("{video_id}", languages=['en'])
formatter = JSONFormatter()
json_formatted = formatter.format_transcript(srt)
print(json_formatted)

在 .get_transcript() 方法中,唯一应该强制提供的参数是 11 位视频 ID,你可以在 v= 之后的每个 YouTube 视频的 URL 中找到它,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.youtube.com/watch? v=hJP5GqnTrNo

当视频提供英语以外的其他语言时,可以将它们添加到参数语言中,该参数语言作为包含不同语言的列表。

该库还提供“Formatter”方法来生成具有定义格式的转录数据。 在这种情况下,我们只需要 JSON 格式即可进行进一步的步骤。

通过运行上面的代码,你会看到像这样的一个像样的转录文本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
{"text": "So anyone who's been paying attention\nfor the last few months", "start": 4.543, "duration": 3.878}, 
{"text": "has been seeing headlines like this,", "start": 8.463, "duration": 2.086},
{"text": "especially in education.", "start": 10.59, "duration": 2.086},
{"text": "The thesis has been:", "start": 12.717, "duration": 1.919},
...
]

3、OpenAI API 密钥

LlamaIndex 的设计目的是兼容各种 LLM,默认使用 OpenAI 的 GPT 模型进行嵌入和生成操作。 因此,当我们决定实施基于 OpenAI GPT 模型的视频摘要器时,我们应该向程序提供我们的 OpenAI API 密钥。

插入我们的密钥唯一需要做的就是通过环境变量提供它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
os.environ["OPENAI_API_KEY"] = '{your_api_key}'

4、LlamaIndex

LlamaIndex 是一个 Python 库,充当用户私有数据和大型语言模型 (LLM) 之间的接口。 它有几个对开发人员有用的功能,包括连接到各种数据源、处理提示限制、创建语言数据索引、将提示插入数据、将文本拆分为更小的块以及提供查询索引的接口的能力 . 借助 LlamaIndex,开发人员无需实施数据转换即可将现有数据用于 LLM,管理 LLM 与数据的交互方式,并提高 LLM 的性能。

可以在此处查看完整的LlamaIndex文档。

以下是使用 LlamaIndex 的一般步骤:

安装包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install llama-index

Step1 — 加载文档文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from llama_index import SimpleDirectoryReader
SimpleDirectoryReader = download_loader("SimpleDirectoryReader")
loader = SimpleDirectoryReader('./data', recursive=True, exclude_hidden=True)
documents = loader.load_data()

SimpleDirectoryReader 是 LlamaIndex 工具集中的文件加载器之一。 它支持在用户提供的文件夹下加载多个文件,在本例中,它是子文件夹“./data/”。 这个神奇的加载器功能可以支持解析各种文件类型,如.pdf、.jpg、.png、.docx等,让您不必自己将文件转换为文本。 在我们的应用程序中,我们只加载一个文本文件 (.json) 来包含视频转录数据。

Step2 — 构建索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from llama_index import LLMPredictor, GPTSimpleVectorIndex, PromptHelper, ServiceContext
from langchain import ChatOpenAI

# define LLM
llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo", max_tokens=500))

service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)

index = GPTSimpleVectorIndex.from_documents(
    documents, service_context=service_context
)

在调用此方法时,LlamaIndex 应与你定义的 LLM 交互以构建索引,在本演示的情况下,LlamaIndex 使用 gpt-3.5 聊天模型通过 OpenAI API 调用嵌入方法。

Step3 — 查询索引

通过建立索引,查询非常简单,无需上下文数据,直接输入即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
response = index.query("Summerize the video transcript")
print(response)

5、Web开发

与我文章中之前的项目一样,我们将继续使用方便的 Streamlit 工具集来构建 Video Summarizer 应用程序。

Streamlit 是一个开源的 Python 库,有助于创建交互式 Web 应用程序。 它的主要目的是供数据科学家和机器学习工程师用来与他人分享他们的工作。 借助 Streamlit,开发人员可以使用最少的代码创建应用程序,并且可以使用单个命令轻松地将它们部署到 Web。

它提供了多种可用于创建交互式应用程序的小部件。 这些小部件包括按钮、文本框、滑块和图表。 可以从其官方文档中找到所有小部件的用法。

Web 应用程序的典型 Streamlit 代码可以像下面这样简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install streamlit
import streamlit as st

st.write("""
# My First App
Hello *world!*
""")

然后只需键入以下命令即可在线运行该网站:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!python -m streamlit run demo.py

如果运行成功,会打印出用户可以访问的URL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
You can now view your Streamlit app in your browser.
Network URL: http://xxx.xxx.xxx.xxx:8501
External URL: http://xxx.xxx.xxx.xxx:8501

6、完整的 Video Summarizer 应用程序

要实现总结 YouTube 视频的整个工作流程,用户体验非常简单。

第 1 步 — 用户输入 YouTube 视频的 URL。

在这一步中,我们通过 Streamlit st.text_input() 方法创建一个 text_input 小部件,以接收用户输入的视频 URL。

第 2 步 — 应用程序下载视频的屏幕截图和文字记录文件,并将它们显示在侧边栏中。

在这一步中,在成功从 URL 解析视频 ID 后,我们使用 html2image 库创建一个侧边栏区域来显示屏幕截图(另存为 ./youtube.png)并显示转录文本(另存为 ./data/transcript。 json )通过使用 LlamaIndex 的 SimpleDirectoryReader() 方法。 我们还从 Streamlit 小部件中实现了一个进度条,以指示剩余时间,因为当视频需要很长时间时,摘要过程会花费更多时间。

第 3 步 — 应用程序生成整个视频的摘要,每 5 分钟的视频有一个详细描述

在此步骤中,如前所述,我们不希望语言模型通过仅搜索摘要作业的相关块来遗漏整个视频中的重要信息。 为避免这种情况,我们创建了一个循环,每 5 分钟查询一次摘要视频部分。 这确保带有向量的提示的标记不超过 4096 个标记的最大限制,防止拆分成块。 需要注意的是,5 分钟间隔只是一个粗略的估计。 我们创建一个 st.expander() 小部件来包含 5 分钟部分的摘要,并创建一个 st.success() 小部件来通过查询显示最终摘要以总结部分摘要。

我用来总结 5 分钟窗口的提示是:

Summarize this article from ”{start_text}\” to ”{end_text}\, limited in 100 words, start with ”This section of video”

start_text 和 end_text 是文本字段中引用转录 JSON 中起始字段的内容

请找到完整的演示代码供你参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!python -m pip install openai streamlit llama-index langchain youtube-transcript-api html2image
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
os.environ["OPENAI_API_KEY"] = '{your_api_key}'

import streamlit as st
from llama_index import download_loader
from llama_index import GPTSimpleVectorIndex
from llama_index import LLMPredictor, GPTSimpleVectorIndex, PromptHelper, ServiceContext
from langchain import OpenAI
from langchain.chat_models import ChatOpenAI

from youtube_transcript_api import YouTubeTranscriptApi
from youtube_transcript_api.formatters import JSONFormatter
import json
import datetime
from html2image import Html2Image

doc_path = './data/'
transcript_file = './data/transcript.json'
index_file = 'index.json'
youtube_img = 'youtube.png'
youtube_link = ''

if 'video_id' not in st.session_state:
    st.session_state.video_id = ''

def send_click():
    st.session_state.video_id = youtube_link.split("v=")[1][:11]

index = None
st.title("Yeyu's Video Summarizer")

sidebar_placeholder = st.sidebar.container()
youtube_link = st.text_input("Youtube link:")
st.button("Summarize!", on_click=send_click)

if st.session_state.video_id != '':

    progress_bar = st.progress(5, text=f"Summarizing...")

    srt = YouTubeTranscriptApi.get_transcript(st.session_state.video_id, languages=['en'])
    formatter = JSONFormatter()
    json_formatted = formatter.format_transcript(srt)
    with open(transcript_file, 'w') as f: 
        f.write(json_formatted)

    hti = Html2Image()
    hti.screenshot(url=f"https://www.youtube.com/watch?v={st.session_state.video_id}", save_as=youtube_img)
    
    SimpleDirectoryReader = download_loader("SimpleDirectoryReader")

    loader = SimpleDirectoryReader(doc_path, recursive=True, exclude_hidden=True)
    documents = loader.load_data()

    sidebar_placeholder.header('Current Processing Video')
    sidebar_placeholder.image(youtube_img)
    sidebar_placeholder.write(documents[0].get_text()[:10000]+'...')

    # define LLM
    llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo", max_tokens=500))
    service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
    index = GPTSimpleVectorIndex.from_documents(
        documents, service_context=service_context
    )
    index.save_to_disk(index_file)

    section_texts = ''
    section_start_s = 0

    with open(transcript_file, 'r') as f:
        transcript = json.load(f)    
    
    start_text = transcript[0]["text"]

    progress_steps = int(transcript[-1]["start"]/300+2)
    progress_period = int(100/progress_steps)
    progress_timeleft = str(datetime.timedelta(seconds=20*progress_steps))
    percent_complete = 5
    progress_bar.progress(percent_complete, text=f"Summarizing...{progress_timeleft} left")

    section_response = ''

    for d in transcript:
    
        if d["start"] <= (section_start_s + 300) and transcript.index(d) != len(transcript) - 1:
            section_texts += ' ' + d["text"]

        else:
            end_text = d["text"]

            prompt = f"summarize this article from \"{start_text}\" to \"{end_text}\", limited in 100 words, start with \"This section of video\""
            #print(prompt)
            response = index.query(prompt)
            start_time = str(datetime.timedelta(seconds=section_start_s))
            end_time = str(datetime.timedelta(seconds=int(d['start']))

            section_start_s += 300
            start_text = d["text"]
            section_texts = ''
    
            section_response += f"**{start_time} - {end_time}:**\n\r{response}\n\r"      

            percent_complete += progress_period
            progress_steps -= 1
            progress_timeleft = str(datetime.timedelta(seconds=20*progress_steps))
            progress_bar.progress(percent_complete, text=f"Summarizing...{progress_timeleft} left")

    prompt = "Summarize this article of a video, start with \"This Video\", the article is: " + section_response
    #print(prompt)
    response = index.query(prompt)
    
    progress_bar.progress(100, text="Completed!")
    st.subheader("Summary:")
    st.success(response, icon= "🤖")

    with st.expander("Section Details: "):
        st.write(section_response)

    st.session_state.video_id = ''
    st.stop()

将代码保存到 Python 文件“demo.py”,创建一个 ./data/ 文件夹,然后运行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!python -m streamlit run demo.py

Video Summarizer 现已准备就绪,能够简单而有效地执行其任务。

注意——请从一段短视频开始测试,因为长视频会花费你大量的 OpenAI API 使用费。 在继续之前,还请检查视频是否启用文本转录。


原文链接:基于LLM的视频摘要开发 - BimAnt

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
RabbitMQ交换器Exchange介绍与实践
有了Rabbit的基础知识之后(基础知识详见:深入解读RabbitMQ工作原理及简单使用),本章我们重点学习一下Rabbit里面的exchange(交换器)的知识。
磊哥
2018/08/02
6660
RabbitMQ交换器Exchange介绍与实践
RabbitMQ面试必备知识点及实战 - Exchange交换机类型详解
Exchange:接收消息,并根据路由键转发消息所绑定的队列。交换机并非一个单独进程,而是一个有着“地址”的列表而已。
JavaEdge
2021/02/23
9290
RabbitMQ面试必备知识点及实战 - Exchange交换机类型详解
07-RabbitMQ核心API-Direct Exchange
所有发送到direct exchange 的消息被转发到Routekey中指定的Queue
彼岸舞
2022/10/06
1790
07-RabbitMQ核心API-Direct Exchange
快速入门RabbitMQ核心概念
我们知道RabbitMQ是基于Erlang编写的,所以在安装RabbitMQ之前需要确保安装了Erlang环境。RabbitMQ与Erlang是有版本对应关系的,可以参考官方列举的版本对应关系:
端碗吹水
2020/11/24
5410
RabbitMQ学习笔记(七)——RabbitMQ分布式事务框架
◆ ACID往往针对传统本地事务,分布式事务无法满足原子性和隔离性,需要舍弃传统ACID理论 ◆ 基于BASE理论,业务状态不需要在微服务系统内强一致 ◆ 基于BASE理论,订单状态要做到最终一致性即可 ◆ 为了做到最终一致性, 要保证消息不丢失,发送处理的流程要有重试机制,重试多次失败后要有告警
不愿意做鱼的小鲸鱼
2022/09/26
1.2K0
RabbitMQ学习笔记(七)——RabbitMQ分布式事务框架
RabbitMQ基础教程之基本使用篇
RabbitMQ基础教程之基本使用篇 最近因为工作原因使用到RabbitMQ,之前也接触过其他的mq消息中间件,从实际使用感觉来看,却不太一样,正好趁着周末,可以好好看一下RabbitMQ的相关知识点;希望可以通过一些学习,可以搞清楚以下几点 基础环境搭建 可以怎么使用 实现原理是怎样的 实际工程中的使用(比如结合SpringBoot可以怎么玩) <!-- more --> 相关博文,欢迎查看: 《RabbitMq基础教程之安装与测试》 《RabbitMq基础教程之基本概念》 I. 前提准备 在开始之前,先
一灰灰blog
2018/06/04
6250
缓存架构之史上讲的最明白的RabbitMQ可靠消息传输实战演练
比如:某个广告主(如:天猫)想在我们的平台(如:今日头条)投放广告,当通过我们的广告系统新建广告的时候,该消息在同步给redis缓存(es)的时候丢失了,而我们又没有发现,造成该广告无法正常显示出来,那这损失就打了,如果1天都没有该广告的投放记录,那就有可能是上百万的损失了,所以消息的可靠传输多我们的广告系统也是很重要的。 其实,生活中这样的场景很场景,再比如:交易系统、订单系统都必须保证消息的可靠传输,否则,损失是巨大的!!!
Java知音
2018/09/26
7710
【BlogBook书】10、RabbitMQ:消息队列
框架中重点使用RabbitMQ和Kafka作为消息队列的中间件工具,本章节说明RabbitMQ的具体使用方式。
老张的哲学
2024/02/22
1790
【BlogBook书】10、RabbitMQ:消息队列
微服务实战(三):落地微服务架构到直销系统(构建基于RabbitMq的消息总线)
从前面文章可以看出,消息总线是EDA(事件驱动架构)与微服务架构的核心部件,没有消息总线,就无法很好的实现微服务之间的解耦与通讯。通常我们可以利用现有成熟的消息代理产品或云平台提供的消息服务来构建自己的消息总线;也可以自己完全写一个消息代理产品,然后基于它构建自己的消息总线。通常我们不用重复造轮子(除非公司有特殊的要求,比如一些大型互联网公司考虑到自主可控的白盒子),可以利用比如像RabbitMq这样成熟的消息代理产品作为消息总线的底层支持。
用户1910585
2018/08/02
8500
RabbitMQ生产者Confirm消息(三)
RabbitMQ的特性是保障数据的一致性,稳定性和可靠性。但是如何来保障这些了?这就有了很多的保障机制。在前面的文章体系中也是介绍到RabbitMQ中的生产者负责把消息发送到Exchange,并不需要关心Queue是什么,那么问题就出现了,如果生产者发送的MQ消息消费者没有收到了?这如何可以做到前面说的数据的一致性以及可靠性了。我们可以结合现实的例子来看这部分,比如我向别人借了100元,然后我要了对方的银行卡号,把钱还给了对方,但是我给对方没有说,那么其实对方是不知道的,所以在对方的心理我始终还是欠他100元的,其实这样的案例在我实际的生活就出现过,当然是很多年前的事了,总是这过程确认反馈的机制。技术也是需要符合人性的,那么RabbitMQ为了做到数据的一致性的保障,在生产者端就有Confirm的确认机制。
无涯WuYa
2022/03/29
9210
RabbitMQ生产者Confirm消息(三)
RabbitMQ 消息确认机制
消息的确认,是指生产者投递消息后,如果 Broker 收到消息,则会给我们生产者一个应答。生产者进行接收应答,用来确定这条消息是否正常的发送到 Broker ,这种方式也是消息的可靠性投递的核心保障!
海向
2019/09/23
1.2K0
RabbitMQ 消息确认机制
实战:SpringBoot集成rabbitmq并实现延时队列
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。
JAVA葵花宝典
2020/07/09
1.1K0
实战:SpringBoot集成rabbitmq并实现延时队列
08-RabbitMQ核心API-Topic Exchange
可以看到3条消息只有2条消息被消费了, 所以*是只能匹配一个词的, 多个词的没有匹配到
彼岸舞
2022/10/06
2020
08-RabbitMQ核心API-Topic Exchange
RabbitMQ延迟消息学习
准备做一个禁言自动解除的功能,立马想到了订单的超时自动解除,刚好最近在看RabbitMQ的实现,于是想用它实现,查询了相关文档发现确实可以实现,动手编写了这篇短文。
河岸飞流
2019/08/09
6410
RabbitMQ限流机制(五)
在服务端的稳定系的体系质量保障中,一个是考虑在客户端高并发的请求后,服务端如何能够接收所有的请求并且服务端能够顶得住洪流的负载。这中间就需要涉及考虑调度机制和队列机制。比如在2022年中,西安一码通是崩溃了又崩溃,这就是很典型的在高可用设计和稳定性体系建设方面缺少系统化的思考。作为主流的核心中间件RabbitMQ,也是考虑到了限流的机制。
无涯WuYa
2022/03/29
5410
RabbitMQ限流机制(五)
RabbitMQ教程(二) ——linux下安装rabbitmq
安装过程参考官网: Installing on RPM-based Linux (RHEL, CentOS, Fedora, openSUSE) 首先需要安装erlang,参考:http://fedoraproject.org/wiki/EPEL/FAQ#howtouse rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm yum install erlang 安装过程中会有提示
生活创客
2018/06/14
1.7K0
RabbitMQ生产者Confirm消息保障(四)
在RabbitMQ生产者Confirm消息中介绍了RabbitMQ生产者端的消息确认的机制,也就是在生产者端把消息发送成功后进行消息的应答机制,但是如果生产者端发送的消息根本没有发送成功了?那么针对这种情况也是需要一种对应的解决方案来进行处理。针对这种特殊的情况RabbitMQ提供了Return消息保障的机制。
无涯WuYa
2022/03/29
7390
RabbitMQ生产者Confirm消息保障(四)
09-RabbitMQ核心API-Fanout Exchange
Fanout Exchange 简介 不处理路由键, 只需要简单的将队列绑定到交换机上 发送到交换机的消息都会被转发到与该交换机绑定的所有队列上 Fanout交换机转发消息是最快的 代码实现 消费者1 package com.dance.redis.mq.rabbit.fanout; import com.dance.redis.mq.rabbit.RabbitMQHelper; import com.rabbitmq.client.*; import java.io.IOException; i
彼岸舞
2022/10/06
2820
09-RabbitMQ核心API-Fanout Exchange
给注册用户发红包,RabbitMQ实现(分布式事务2)
DLX,Dead Letter Exchange 的缩写,又死信邮箱、死信交换机。DLX就是一个普通的交换机,和一般的交换机没有任何区别。 当消息在一个队列中变成死信(dead message)时,通过这个交换机将死信发送到死信队列中(指定好相关参数,rabbitmq会自动发送)。
算法之名
2019/08/21
7540
给注册用户发红包,RabbitMQ实现(分布式事务2)
rabbitmq死信队列详解与使用
先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer将消息投递到broker或者直接到queue里了,consumer从queue取出消息进行消费,但某些时候由于特定的原因导致queue中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信,自然就有了死信队列;
leon公众号精选
2022/04/27
1K0
rabbitmq死信队列详解与使用
推荐阅读
相关推荐
RabbitMQ交换器Exchange介绍与实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验