[{"data":1,"prerenderedAt":5309},["ShallowReactive",2],{"search-docs":3,"doc-\u002Fgolang\u002Fdistributed\u002Fmq":886},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,159,162,165,169,172,175,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,269,273,277,281,285,288,291,294,298,301,304,307,310,313,316,319,322,325,329,332,336,340,344,348,352,356,359,362,365,368,371,374,377,380,383,386,389,393,396,399,402,405,408,411,414,417,420,424,428,432,435,438,442,446,450,454,458,462,466,470,474,477,480,483,487,491,494,497,500,504,507,511,515,518,521,524,527,530,533,536,539,542,545,548,551,554,557,560,563,566,569,572,575,579,583,587,591,595,599,603,606,610,614,617,620,623,626,629,633,637,640,643,646,649,652,655,658,661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,716,720,724,728,732,736,740,744,748,752,756,760,764,768,772,775,779,783,787,790,793,796,799,802,805,808,811,814,818,822,825,829,832,835,838,841,844,848,851,854,858,862,865,869,873,876,879,882],{"path":5,"title":6,"description":7},"\u002Fabout\u002Fauthor","作者相关","只想纯粹的做一个程序员...",{"path":9,"title":10,"description":11},"\u002Fabout\u002Fjourney","心路历程","",{"path":13,"title":14,"description":15},"\u002Fai\u002Fagent\u002Fframeworks","Agent 框架","主流 Agent 框架：LangChain、LlamaIndex、AutoGen、CrewAI",{"path":17,"title":18,"description":19},"\u002Fai\u002Fagent\u002Fhooks","Agent Hooks 与自动化","Claude Agent 的 Hooks 生命周期、事件类型、典型自动化场景",{"path":21,"title":22,"description":23},"\u002Fai\u002Fagent\u002Fintroduction","AI Agent 概述","AI Agent 核心概念：感知、规划、执行、记忆",{"path":25,"title":26,"description":27},"\u002Fai\u002Fagent\u002Fpractice","Agent 实战","AI Agent 实战：构建自主任务执行系统",{"path":29,"title":30,"description":31},"\u002Fai\u002Fagent\u002Fsdk","Claude Agent SDK 开发","使用 Claude Agent SDK 构建自定义 AI Agent：架构、API、生命周期",{"path":33,"title":34,"description":35},"\u002Fai\u002Fagent\u002Fsubagents","Subagents 子代理","用 Subagents 分解复杂任务、并发执行、隔离上下文",{"path":37,"title":38,"description":39},"\u002Fai\u002Fagent\u002Ftool-use","工具调用","AI Agent 工具调用：Function Calling、Tool Use 原理与实践",{"path":41,"title":42,"description":43},"\u002Fai\u002Ffundamentals\u002Fdeep-learning","深度学习入门","深度学习基础知识：前向传播、反向传播、损失函数、优化器",{"path":45,"title":46,"description":47},"\u002Fai\u002Ffundamentals\u002Fml-basics","机器学习基础","机器学习核心概念：监督学习、无监督学习、强化学习",{"path":49,"title":50,"description":51},"\u002Fai\u002Ffundamentals\u002Fneural-networks","神经网络原理","神经网络架构：CNN、RNN、注意力机制",{"path":53,"title":54,"description":55},"\u002Fai\u002Fgetting-started","AI 学习路线","AI 技术学习路线图，从基础到实战的完整指南",{"path":57,"title":58,"description":59},"\u002Fai\u002Fllm\u002Ffine-tuning","模型微调","大模型微调技术：LoRA、QLoRA、全量微调、RLHF",{"path":61,"title":62,"description":63},"\u002Fai\u002Fllm\u002Fintroduction","大模型概述","大语言模型发展历程、核心能力与主流模型对比",{"path":65,"title":66,"description":67},"\u002Fai\u002Fllm\u002Flocal-deploy","本地部署","大模型本地部署：Ollama、vLLM、llama.cpp",{"path":69,"title":70,"description":71},"\u002Fai\u002Fllm\u002Ftransformer","Transformer 架构","Transformer 架构详解：自注意力机制、位置编码、多头注意力",{"path":73,"title":74,"description":75},"\u002Fai\u002Fmcp\u002Fclient","MCP Client 开发","MCP Client 开发指南：连接、调用、集成",{"path":77,"title":78,"description":79},"\u002Fai\u002Fmcp\u002Fdebugging","MCP 调试与排错","MCP Server 开发与集成过程中的常见问题、日志分析、诊断工具",{"path":81,"title":82,"description":83},"\u002Fai\u002Fmcp\u002Fintroduction","MCP 概述","Model Context Protocol 协议概述：架构、核心概念、应用场景",{"path":85,"title":86,"description":87},"\u002Fai\u002Fmcp\u002Fserver","MCP Server 开发","MCP Server 开发指南：资源、工具、提示词的实现",{"path":89,"title":90,"description":91},"\u002Fai\u002Fmcp\u002Ftools","MCP Tools 深入","深入理解 MCP Tools：与 Resources\u002FPrompts 的差异、Schema 设计、Annotations 与权限控制",{"path":93,"title":94,"description":95},"\u002Fai\u002Fprompt\u002Fadvanced","高级 Prompt 模式","高级 Prompt 设计模式：Tree-of-Thought、自我反思、多轮对话策略",{"path":97,"title":98,"description":99},"\u002Fai\u002Fprompt\u002Fbasics","Prompt 基础","Prompt Engineering 入门：基本概念、角色设定、输出格式控制",{"path":101,"title":102,"description":103},"\u002Fai\u002Fprompt\u002Ftechniques","提示词技巧","常用提示词技巧：Few-shot、Chain-of-Thought、ReAct",{"path":105,"title":106,"description":107},"\u002Fai\u002Frag\u002Fembedding","文本嵌入","文本嵌入模型：Embedding 原理、模型选择、相似度计算",{"path":109,"title":110,"description":111},"\u002Fai\u002Frag\u002Fintroduction","RAG 概述","检索增强生成（RAG）架构原理、优势与应用场景",{"path":113,"title":114,"description":115},"\u002Fai\u002Frag\u002Fpractice","RAG 实战","RAG 应用实战：文档问答系统、知识库搭建",{"path":117,"title":118,"description":119},"\u002Fai\u002Frag\u002Fvector-database","向量数据库","主流向量数据库对比：Milvus、Pinecone、Chroma、Weaviate",{"path":121,"title":122,"description":123},"\u002Fai\u002Fskills\u002Fbest-practices","Skill 最佳实践","编写高质量 Skill 的设计原则、常见陷阱与优化技巧",{"path":125,"title":126,"description":127},"\u002Fai\u002Fskills\u002Fcreating","创建自定义 Skill","从零编写一个可被 Agent 自动发现和调用的 Skill",{"path":129,"title":130,"description":131},"\u002Fai\u002Fskills\u002Fintroduction","Agent Skills 概述","Claude Agent Skills 概念、工作原理、与 Tools\u002FMCP 的区别",{"path":133,"title":134,"description":135},"\u002Fgolang\u002Fadvanced\u002Fconcurrency","Go - 并发深入","深入理解 Go 并发编程的核心机制。",{"path":137,"title":138,"description":139},"\u002Fgolang\u002Fadvanced\u002Fgc","Go - 垃圾回收","理解 Go 的垃圾回收机制，掌握 GC 调优方法。",{"path":141,"title":142,"description":143},"\u002Fgolang\u002Fadvanced\u002Fgmp","Go - GMP 调度模型","GMP 是 Go 运行时调度器的核心模型，理解它对于编写高性能 Go 程序至关重要。",{"path":145,"title":146,"description":147},"\u002Fgolang\u002Fadvanced\u002Fgo-concurrency","Go - 并发编程","Go 的并发是其核心特性之一，通过 Goroutine 和 Channel 实现。",{"path":149,"title":150,"description":151},"\u002Fgolang\u002Fadvanced\u002Fmemory","Go - 内存模型","理解 Go 的内存分配机制和内存模型。",{"path":153,"title":154,"description":155},"\u002Fgolang\u002Fadvanced\u002Fprofiling","Go - 性能分析","掌握 Go 的性能分析工具：pprof、trace、benchmark。",{"path":157,"title":158,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-basic","Go - 基础语法",{"path":160,"title":161,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-composite","Go - 复合类型",{"path":163,"title":164,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-control","Go - 流程控制",{"path":166,"title":167,"description":168},"\u002Fgolang\u002Fcore\u002Fgo-error","Go - 错误处理","Go 使用显式的错误返回值来处理错误，而不是异常机制。",{"path":170,"title":171,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-function","Go - 函数",{"path":173,"title":174,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-install","Go - 环境搭建",{"path":176,"title":177,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-interface","Go - 接口",{"path":179,"title":180,"description":181},"\u002Fgolang\u002Fcore\u002Fgo-module","Go - 包管理","Go Modules 是 Go 1.11 引入的官方依赖管理方案，Go 1.16 后成为默认模式。",{"path":183,"title":184,"description":185},"\u002Fgolang\u002Fdistributed\u002Fgrpc","Go - gRPC","gRPC 是 Google 开发的高性能 RPC 框架，使用 Protocol Buffers 作为序列化协议。",{"path":187,"title":188,"description":189},"\u002Fgolang\u002Fdistributed\u002Fmicroservice","Go - 微服务","微服务架构的核心组件：服务发现、负载均衡、熔断降级。",{"path":191,"title":192,"description":193},"\u002Fgolang\u002Fdistributed\u002Fmq","Go - 消息队列","使用 Go 操作 Kafka 和 RabbitMQ。",{"path":195,"title":196,"description":197},"\u002Fgolang\u002Fdistributed\u002Fredis","Go - Redis","使用 go-redis 操作 Redis，实现缓存、分布式锁等功能。",{"path":199,"title":200,"description":201},"\u002Fgolang\u002Fengineering\u002Fconfig","Go - 配置管理","使用 viper 进行配置管理，支持多种配置格式和配置中心。",{"path":203,"title":204,"description":205},"\u002Fgolang\u002Fengineering\u002Fdocker","Go - Docker 部署","使用 Docker 容器化部署 Go 应用。",{"path":207,"title":208,"description":209},"\u002Fgolang\u002Fengineering\u002Fkubernetes","Go - Kubernetes 部署","在 Kubernetes 上部署和管理 Go 应用。",{"path":211,"title":212,"description":213},"\u002Fgolang\u002Fengineering\u002Flogging","Go - 日志系统","使用 zap 和 logrus 构建高性能结构化日志系统。",{"path":215,"title":216,"description":217},"\u002Fgolang\u002Fengineering\u002Ftesting","Go - 单元测试","Go 内置了强大的测试框架，掌握测试是编写高质量代码的基础。",{"path":219,"title":220,"description":221},"\u002Fgolang\u002Fstdlib\u002Fbufio","bufio","在 Go 语言中，bufio 包提供了带缓冲的 I\u002FO 操作，能够提高读写性能。以下是一些常用的 bufio 包 API 及其详细说明：",{"path":223,"title":224,"description":225},"\u002Fgolang\u002Fstdlib\u002Fcontainer","container","在Go语言标准库中，container 包提供了几种常用的数据结构实现，这些数据结构对于高效地管理和操作数据非常有用。以下是 container 包中主要的数据结构：",{"path":227,"title":228,"description":229},"\u002Fgolang\u002Fstdlib\u002Fcrypto","crypto","在 Go 语言中，crypto 包提供了一组用于加密和解密的功能。以下是一些常用的 crypto 包及其子包的 API 及其详细说明：",{"path":231,"title":232,"description":233},"\u002Fgolang\u002Fstdlib\u002Fencoding-csv","encoding\u002Fcsv","在 Go 语言中，encoding\u002Fcsv 包提供了对 CSV（逗号分隔值）文件进行读写的功能。以下是一些常用的 encoding\u002Fcsv 包的 API 及其详细说明：",{"path":235,"title":236,"description":237},"\u002Fgolang\u002Fstdlib\u002Fencoding-json","encoding\u002Fjson","在 Go 语言中，encoding\u002Fjson 包提供了对 JSON 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fjson 包的 API 及其详细说明：",{"path":239,"title":240,"description":241},"\u002Fgolang\u002Fstdlib\u002Fencoding-xml","encoding\u002Fxml","在 Go 语言中，encoding\u002Fxml 包提供了对 XML 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fxml 包的 API 及其详细说明：",{"path":243,"title":244,"description":245},"\u002Fgolang\u002Fstdlib\u002Fflag","flag","在Go语言中，flag 包是用于处理命令行参数的标准库，它提供了一种简单而直接的方式来解析和使用命令行参数。下面是关于 flag 包的一些基本介绍和常用功能：",{"path":247,"title":248,"description":249},"\u002Fgolang\u002Fstdlib\u002Ffmt","fmt","在 Go 语言的标准库中，fmt 包是非常重要的，它提供了处理格式化输入和输出的基本工具。以下是一些 fmt 包内常用的API：",{"path":251,"title":252,"description":253},"\u002Fgolang\u002Fstdlib\u002Fhttp","net\u002Fhttp","在 Go 语言中，net\u002Fhttp 包提供了用于构建 HTTP 客户端和服务器的强大工具。以下是一些常用的 net\u002Fhttp 包的 API 及其详细说明：",{"path":255,"title":256,"description":257},"\u002Fgolang\u002Fstdlib\u002Fio","io","在 Go 语言中，io 包提供了基本的输入输出功能。以下是一些常用的 io 包的 API 及其详细说明：",{"path":259,"title":260,"description":261},"\u002Fgolang\u002Fstdlib\u002Flog","log","在 Go 语言中，log 包提供了简单的日志记录功能。以下是一些常用的 log 包的 API 及其详细说明：",{"path":263,"title":264,"description":265},"\u002Fgolang\u002Fstdlib\u002Fmath","math","在 Go 语言中，math 包提供了基本的数学函数和常量。以下是一些常用的 math 包的 API 及其详细说明：",{"path":267,"title":268,"description":11},"\u002Fgolang\u002Fstdlib\u002Fnet","net",{"path":270,"title":271,"description":272},"\u002Fgolang\u002Fstdlib\u002Fos","os","在Go语言中，os 包是一个非常重要且常用的标准库，它提供了与操作系统交互的功能，包括文件操作、环境变量管理、进程管理等。下面是一些 os 包中常用的功能和API：",{"path":274,"title":275,"description":276},"\u002Fgolang\u002Fstdlib\u002Fsort","order","在 Go 语言中，sort 包提供了对切片和用户定义的集合进行排序的函数。它实现了常见的排序算法，如快速排序（Quicksort）和堆排序（Heapsort），并且为自定义集合提供了接口，使得用户可以根据特定的需求进行排序。",{"path":278,"title":279,"description":280},"\u002Fgolang\u002Fstdlib\u002Fstrconv","strconv","在 Go 语言中，strconv 包提供了字符串和基本数据类型之间的转换函数，例如将整数转换为字符串、字符串转换为整数，以及其他类型之间的转换。这些功能非常有用，特别是在处理用户输入或从外部数据源读取数据时。",{"path":282,"title":283,"description":284},"\u002Fgolang\u002Fstdlib\u002Ftime","time","在 Go 语言中，time 包提供了处理时间和日期的功能。以下是一些常用的 time 包的 API 及其详细说明：",{"path":286,"title":287,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ferror","Gin - 错误处理",{"path":289,"title":290,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ffile","Gin - 文件处理",{"path":292,"title":293,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fmiddleware","Gin - 中间件",{"path":295,"title":296,"description":297},"\u002Fgolang\u002Fweb\u002Fgin\u002Fquickstart","Gin - 快速开始","Gin 是目前最流行的 Go Web 框架，以高性能和简洁 API 著称。",{"path":299,"title":300,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frequest","Gin - 请求处理",{"path":302,"title":303,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fresponse","Gin - 响应处理",{"path":305,"title":306,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frouter","Gin - 路由",{"path":308,"title":309,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fvalidation","Gin - 参数校验",{"path":311,"title":312,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fassociation","GORM - 关联关系",{"path":314,"title":315,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fcrud","GORM - CRUD 操作",{"path":317,"title":318,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fmodel","GORM - 模型定义",{"path":320,"title":321,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fperformance","GORM - 日志与性能",{"path":323,"title":324,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquery","GORM - 高级查询",{"path":326,"title":327,"description":328},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquickstart","GORM - 快速开始","GORM 是 Go 语言最流行的 ORM 库，功能强大，使用简单。",{"path":330,"title":331,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Ftransaction","GORM - 事务与 Hook",{"path":333,"title":334,"description":335},"\u002Finterview\u002Fbasic","计算机基础面经","本章节汇总了面试中常见的通用技术概念，不局限于特定语言或数据库，是考察技术内功的关键考点。",{"path":337,"title":338,"description":339},"\u002Finterview\u002Fgolang","Golang 面试题","Go 语言面试高频考点，覆盖基础语法、数据结构、并发编程、内存管理、GC、调度器等核心知识。",{"path":341,"title":342,"description":343},"\u002Finterview\u002Fk8s","Kubernetes 面试题","Kubernetes（K8s）面试高频考点，覆盖架构原理、核心资源、网络存储、调度策略、运维监控等核心知识。",{"path":345,"title":346,"description":347},"\u002Finterview\u002Fmysql","MySQL 面试题","MySQL 数据库面试高频考点，覆盖索引、事务、锁、优化、主从复制等核心知识。",{"path":349,"title":350,"description":351},"\u002Finterview\u002Fredis","Redis 面试题","Redis 面试高频考点，覆盖数据结构、持久化、集群、缓存一致性、性能优化等核心知识。",{"path":353,"title":354,"description":355},"\u002Finterview\u002Frocketmq","RocketMQ 面试题","RocketMQ 面试高频考点，覆盖消息模型、可靠性、顺序消息、事务消息、存储与高可用等核心知识。",{"path":357,"title":358,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-arraylist","List - ArrayList 源码解析",{"path":360,"title":361,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-linkedlist","List - LinkedList 源码解析",{"path":363,"title":364,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-stack","List - Satck源码解析",{"path":366,"title":367,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-vectore","List - Vector 源码解析",{"path":369,"title":370,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-hashmap","Map - HashMap 源码解析",{"path":372,"title":373,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-linkedhashmap","Map - LinkedHashMap 源码解析",{"path":375,"title":376,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-treemap","Map - TreeMap 源码解析",{"path":378,"title":379,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-deque","Queue - Deque 接口解析",{"path":381,"title":382,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-queue","Queue - Queue 接口解析",{"path":384,"title":385,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-hashset","Set - HashSet源码解析",{"path":387,"title":388,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-linkedhashset","Set - LinkedHashSet 源码解析",{"path":390,"title":391,"description":392},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-treeset","Set - TreeSet源码解析","TreeSet 是一个 Set 集合接口的实现类，与 HashSet 类似，其底层也是通过维护了一个 TreeMap 对象来封装了一些实现方法，故本篇不再对 TreeSet 的底层原理进行详细说明，仅对常用 API 做简单介绍，如需了解 TreeMap 的底层实现原理，请移步 Map - HashMap 源码解析",{"path":394,"title":395,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fannotation","Java核心 - 注解",{"path":397,"title":398,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fbasic-grammar","Java核心 - 基础语法",{"path":400,"title":401,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fclass-and-object","Java核心 - 面向对象",{"path":403,"title":404,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fcommon-classes","Java核心 - 常用类",{"path":406,"title":407,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fexception","Java核心 - 异常处理",{"path":409,"title":410,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fgenerics","Java核心 - 泛型",{"path":412,"title":413,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fjdk-env-path","Java核心 - 环境搭建",{"path":415,"title":416,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Freflection","Java核心 - 反射",{"path":418,"title":419,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fstring","Java核心 - String 字符串",{"path":421,"title":422,"description":423},"\u002Fother\u002Fjava\u002Fio\u002Fbuffer-stream","Java IO - 缓冲流","缓冲流是对基本流的包装，通过内置缓冲区减少系统调用次数，大幅提升读写效率。",{"path":425,"title":426,"description":427},"\u002Fother\u002Fjava\u002Fio\u002Fbyte-stream","Java IO - 字节流","字节流是 Java IO 中最基本的流类型，以字节（byte）为单位进行数据读写，可以处理任意类型的文件。",{"path":429,"title":430,"description":431},"\u002Fother\u002Fjava\u002Fio\u002Fchar-stream","Java IO - 字符流","字符流以字符为单位进行读写，专门用于处理文本文件。相比字节流，字符流能够正确处理字符编码，避免中文乱码问题。",{"path":433,"title":434,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Ffile","Java IO - File 类",{"path":436,"title":437,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Fio-stream-system","Java IO - IO流概述",{"path":439,"title":440,"description":441},"\u002Fother\u002Fjava\u002Fio\u002Fnio","Java IO - NIO","NIO（New IO）是 JDK 1.4 引入的新 IO 模型，提供了更高效的 IO 操作方式，支持非阻塞 IO 和多路复用。",{"path":443,"title":444,"description":445},"\u002Fother\u002Fjava\u002Fjvm\u002Fclass-loading","类加载机制","类加载机制是 JVM 将 .class 文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可被 JVM 直接使用的 Java 类型的过程。",{"path":447,"title":448,"description":449},"\u002Fother\u002Fjava\u002Fjvm\u002Fgarbage-collection","垃圾回收","垃圾回收（Garbage Collection，GC）是 JVM 自动管理内存的机制，负责回收不再使用的对象所占用的内存。",{"path":451,"title":452,"description":453},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-memory","JVM 内存结构","JVM 在执行 Java 程序时，会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途、创建和销毁时间。",{"path":455,"title":456,"description":457},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-tuning","JVM 调优","JVM 调优是优化 Java 应用性能的重要手段，主要包括参数配置、性能监控和问题排查。",{"path":459,"title":460,"description":461},"\u002Fother\u002Fjava\u002Fthread\u002Fatomic","原子类","Java 原子类（Atomic Classes）提供了一种无锁的线程安全方式，基于 CAS（Compare-And-Swap）操作实现。",{"path":463,"title":464,"description":465},"\u002Fother\u002Fjava\u002Fthread\u002Fcompletable-future","CompletableFuture","CompletableFuture 是 JDK 8 引入的异步编程工具，实现了 Future 和 CompletionStage 接口，支持函数式编程和链式调用。",{"path":467,"title":468,"description":469},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-collections","并发集合","Java 并发包提供了多种线程安全的集合类，用于替代传统的同步集合（如 Collections.synchronizedList）。",{"path":471,"title":472,"description":473},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-utils","并发工具类","Java 并发包提供了多种实用的并发工具类，用于控制线程之间的协调与同步。",{"path":475,"title":476,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fsynchronized-lock","同步机制",{"path":478,"title":479,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-basic","线程基础",{"path":481,"title":482,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-pool","线程池",{"path":484,"title":485,"description":486},"\u002Fother\u002Fspring-series\u002Fspring\u002Fannotations-beans","Spring - 基于注解管理Bean","从 Java 5 开始，Java 增加了对注解（Annotation）的支持，它是代码中的一种特殊标记，可以在编译、类加载和运行时被读取，执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下，在源代码中嵌入补充信息。",{"path":488,"title":489,"description":490},"\u002Fother\u002Fspring-series\u002Fspring\u002Fimplement-ioc","Spring - 原理手写IoC","Spring 框架的 IOC 是基于 Java 反射机制实现的，在学习手写 IoC 之前，你需要具备一定的 Java 反射相关的知识，参考本站内的 Java 教程。",{"path":492,"title":493,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fintroduction-case","Spring - 入门案例",{"path":495,"title":496,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aop","Spring - 面向切面AOP",{"path":498,"title":499,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aot","Spring - AOT提前编译",{"path":501,"title":502,"description":503},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-data-validation","Spring - 数据校验","在开发中，我们经常遇到参数校验的需求，比如用户注册的时候，要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式，我们会把校验的代码和真正的业务处理逻辑耦合在一起，而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则，把校验和业务逻辑分离开，让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装，方便在Spring中使用。",{"path":505,"title":506,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-i18n","Spring - 国际化i18n",{"path":508,"title":509,"description":510},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-ioc","Spring - IOC容器","IoC 是 Inversion of Control 的简写，译为“控制反转”，它不是一门技术，而是一种设计思想，是一个重要的面向对象编程法则，能够指导我们如何设计出松耦合、更优良的程序。",{"path":512,"title":513,"description":514},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-junit","Spring - 单元测试JUnit","在之前的测试方法中，几乎都能看到以下的两行代码：",{"path":516,"title":517,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-resources","Spring - 资源操作",{"path":519,"title":520,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-summarize","Spring - Spring概述",{"path":522,"title":523,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-transaction","Spring - 事务",{"path":525,"title":526,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans","Spring - 基于XML管理Bean",{"path":528,"title":529,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-config","SpringBoot - 配置详解",{"path":531,"title":532,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-data","SpringBoot - 数据访问",{"path":534,"title":535,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-quickstart","SpringBoot - 快速入门",{"path":537,"title":538,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-web","SpringBoot - Web 开发",{"path":540,"title":541,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-config","SpringCloud - 配置中心",{"path":543,"title":544,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-discovery","SpringCloud - 服务注册与发现",{"path":546,"title":547,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-feign","SpringCloud - 服务调用",{"path":549,"title":550,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-gateway","SpringCloud - 服务网关",{"path":552,"title":553,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-introduction","SpringCloud - 微服务概述",{"path":555,"title":556,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-sentinel","SpringCloud - 服务保护",{"path":558,"title":559,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-databind","SpringMVC - 数据绑定与转换",{"path":561,"title":562,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-exception","SpringMVC - 异常处理",{"path":564,"title":565,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-interceptor","SpringMVC - 拦截器",{"path":567,"title":568,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-introduction","SpringMVC - 简介与环境搭建",{"path":570,"title":571,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-request","SpringMVC - 请求处理",{"path":573,"title":574,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-response","SpringMVC - 响应处理",{"path":576,"title":577,"description":578},"\u002Fproject\u002Frocket-leaf\u002Farchitecture","项目架构","Rocket-Leaf 的目录结构、模块划分、数据流向，以及各层之间的依赖关系。",{"path":580,"title":581,"description":582},"\u002Fproject\u002Frocket-leaf\u002Fbackend-layers","后端分层设计","Rocket-Leaf 的 model \u002F rocketmq \u002F service 三层结构，以及服务之间的依赖关系与设计取舍。",{"path":584,"title":585,"description":586},"\u002Fproject\u002Frocket-leaf\u002Fclient-manager","RocketMQ 客户端管理器","AdminClientManager 的多客户端池、默认连接懒加载、自动重连重试的设计与实现。",{"path":588,"title":589,"description":590},"\u002Fproject\u002Frocket-leaf\u002Fencryption","连接信息加密存储","AES-256-GCM + SHA-256 字段级派生密钥的实现，以及如何在不破坏兼容性的前提下为历史明文数据做透明迁移。",{"path":592,"title":593,"description":594},"\u002Fproject\u002Frocket-leaf\u002Ffrontend","前端结构与类型绑定","React + Vite 目录组织、自动生成的 Wails 绑定、api 薄封装与自定义 hooks 的职责划分。",{"path":596,"title":597,"description":598},"\u002Fproject\u002Frocket-leaf","项目简介","Rocket-Leaf 是一款基于 Wails v3 构建的跨平台 RocketMQ 桌面管理客户端，Go 后端 + React 前端。本文档系列拆解它的架构与关键实现。",{"path":600,"title":601,"description":602},"\u002Fproject\u002Frocket-leaf\u002Fwails-v3","Wails v3 入门","Wails v3 的核心概念、Service 绑定机制，以及 Rocket-Leaf 是如何用它把 Go 后端和 React 前端打通的。",{"path":604,"title":605,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-basic","Docker - 入门基础",{"path":607,"title":608,"description":609},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-compose","Docker - Compose","在部署应用时，常常使用到不止一个容器，那么在部署容器的时候就需要一个一个进行部署，这样的部署过程也相对来说比较繁琐复杂，也容易出问题，那么有没有一种更为简单的方法呢？",{"path":611,"title":612,"description":613},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-container-connection","Docker - 容器互联","在上一个章节中我们学习了 Docker 容器的端口映射，可以将 Docker 容器和本地以及网络中的端口进行连接起来。",{"path":615,"title":616,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-dockerfile","Docker - Dockerfile",{"path":618,"title":619,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-helloworld","Docker - HelloWorld",{"path":621,"title":622,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-install","Docker - 安装",{"path":624,"title":625,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-introduce","Docker - 简介",{"path":627,"title":628,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-object","Docker - 镜像、容器、仓库",{"path":630,"title":631,"description":632},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-warehouse","Docker - 仓库管理","仓库是集中存放资源的地方，代码仓库是存放代码的，那么Docker 中的仓库就是存放 Docker 镜像的。",{"path":634,"title":635,"description":636},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-web-containers","Docker - WEB应用实例","在之前的章节中，仅对普通容器进行了演示，但在实际中常常使用到 Docker 容器中的 WEB 应用程序。",{"path":638,"title":639,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-config","Kubernetes - ConfigMap 与 Secret",{"path":641,"title":642,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-helm","Kubernetes - Helm 包管理",{"path":644,"title":645,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-install","Kubernetes - 集群安装",{"path":647,"title":648,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-introduction","Kubernetes - 简介与架构",{"path":650,"title":651,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-kubectl","Kubernetes - kubectl 命令行工具",{"path":653,"title":654,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-monitoring","Kubernetes - 监控与日志",{"path":656,"title":657,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-network-security","Kubernetes - 网络与安全",{"path":659,"title":660,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-service","Kubernetes - Service 与 Ingress",{"path":662,"title":663,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-storage","Kubernetes - 持久化存储",{"path":665,"title":666,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-workload","Kubernetes - 工作负载资源",{"path":668,"title":669,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-bash","Linux - Bash 基础语法",{"path":671,"title":672,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-file-directory","Linux - 文件与目录操作",{"path":674,"title":675,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-network","Linux - 网络配置",{"path":677,"title":678,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-package","Linux - 软件包管理",{"path":680,"title":681,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-process","Linux - 进程管理",{"path":683,"title":684,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-scripts","Linux - 常用脚本示例",{"path":686,"title":687,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-service","Linux - 服务管理",{"path":689,"title":690,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-user-permission","Linux - 用户与权限管理",{"path":692,"title":693,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-https","Nginx - HTTPS 配置",{"path":695,"title":696,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-install","Nginx - 安装与配置",{"path":698,"title":699,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-loadbalance","Nginx - 负载均衡",{"path":701,"title":702,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-optimization","Nginx - 性能优化",{"path":704,"title":705,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-proxy","Nginx - 反向代理",{"path":707,"title":708,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-static","Nginx - 静态资源服务",{"path":710,"title":711,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-vhost","Nginx - 虚拟主机配置",{"path":713,"title":714,"description":715},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-architecture","MySQL 高可用架构","主从复制、读写分离、分库分表。",{"path":717,"title":718,"description":719},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-index","MySQL 索引","索引是帮助 MySQL 高效获取数据的有序数据结构。",{"path":721,"title":722,"description":723},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-lock","MySQL 锁","锁用于解决并发访问时的数据一致性问题。",{"path":725,"title":726,"description":727},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-optimize","MySQL 性能优化","SQL 优化是后端开发必备技能。",{"path":729,"title":730,"description":731},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-transaction","MySQL 事务","事务是一组不可分割的操作，要么全部成功，要么全部失败。",{"path":733,"title":734,"description":735},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-advanced","SQL 进阶","多表查询、子查询、函数、视图、存储过程。",{"path":737,"title":738,"description":739},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-basic","SQL 基础","SQL（Structured Query Language）是操作关系型数据库的标准语言。",{"path":741,"title":742,"description":743},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-advanced","Redis 进阶功能","事务、发布订阅、Lua 脚本、Pipeline。",{"path":745,"title":746,"description":747},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-basic","Redis 基础","Redis 安装配置与基本命令。",{"path":749,"title":750,"description":751},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-cluster","Redis 高可用","主从复制、哨兵、Cluster 集群。",{"path":753,"title":754,"description":755},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-datatype","Redis 数据类型","Redis 5 种基本数据类型 + 4 种特殊类型。",{"path":757,"title":758,"description":759},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-optimize","Redis 性能优化","内存优化、缓存问题、最佳实践。",{"path":761,"title":762,"description":763},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-persistence","Redis 持久化","Redis 提供 RDB 和 AOF 两种持久化方式。",{"path":765,"title":766,"description":767},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-principle","Redis 底层原理","数据结构、线程模型、网络模型。",{"path":769,"title":770,"description":771},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fbehaiver-patterns\u002Fobserver-pattern","观察者模式","观察者模式属于行为型模式，定义了对象之间的一对多的依赖关系，在这种模式中，当一个对象的状态发生变化时，所有依赖于它的对象都会得到通知，并且执行相关操作。观察者模式又被成为“发布—订阅模式”，即发布者发生改变后，会通知所有订阅者。",{"path":773,"title":774,"description":11},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Ffactory-pattern","工厂模式",{"path":776,"title":777,"description":778},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Fsingleton-pattern","单例模式","单例模式是最常用的设计模式之一，他可以保证在整个应用中，某个类只存在一个实例化对象，即全局使用到该类的只有一个对象，这种模式在需要限制某些类的实例数量时非常有用，通常全局只需要一个该对象即可，如一些配置文件映射对象、数据库连接对象等。",{"path":780,"title":781,"description":782},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fstructural-patterns\u002Fadapter-pattern","适配器模式","适配器模式是一种结构型模式，可以将一个类的接口转换成客户端所期望的另一种接口，适配器模式可以帮助开发人员在不修改现有代码的情况下，将不兼容的类组合在一起。",{"path":784,"title":785,"description":786},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-basic-operations","Git 创建版本库","在 Git 上创建版本库有两种方式，一种是直接拷贝远程 Git 仓库到本地，另外一种是我们自己创建本地的版本库。",{"path":788,"title":789,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-branch-manage","Git 分支管理",{"path":791,"title":792,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-content-operations","Git 仓库内容操作",{"path":794,"title":795,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-introduce-install","Git 介绍和安装",{"path":797,"title":798,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-remote-manage","Git 远程管理",{"path":800,"title":801,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-workspace-index-repo","Git 工作原理",{"path":803,"title":804,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fhomebrew","HomeBrew 教程",{"path":806,"title":807,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fidea\u002Fshortcuts","快捷键",{"path":809,"title":810,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fmaven\u002Fintroduce-install-config","Maven - 介绍、安装、配置",{"path":812,"title":813,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fbasic-knowledge","2. 基础知识",{"path":815,"title":816,"description":817},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomponent-communication","9. 组件通信","在前面的章节内，介绍了 Vue 中最核心的内容——组件的介绍和使用，和 Java 等编程语言相反，组件并不近似于这些变成语言中的类，类可以通过类或者其实例化的对象来相互交互，但 Vue 组件之间的作用域是相互独立的，这就意味着不同组件之间的数据无法相互引用。",{"path":819,"title":820,"description":821},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomputed","4. 计算属性","虽然直接在模板中使用表达式方便，但是如果在模板中添加很多逻辑，会让模板变的臃肿且难维护，耦合度较高。有没有一种简单的方式来实现呢？答案是有的。",{"path":823,"title":824,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcreate-vue-project","1. 环境搭建及安装",{"path":826,"title":827,"description":828},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Flife-cycle","6. 生命周期","生命周期是指组件从创建、挂载、更新到销毁的整个过程中所经历的一系列阶段。在 Vue 中，每个组件都有自己的生命周期，可以通过生命周期钩子函数来监听和处理组件在不同阶段的行为和状态。",{"path":830,"title":831,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fother-api","10. 其他 API",{"path":833,"title":834,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fpinia","8. Pinia",{"path":836,"title":837,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Frouter","7. 路由",{"path":839,"title":840,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Ftemplate-grammar","3. 指令及模板语法",{"path":842,"title":843,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fvue3-new-component","11. Vue3 新组件",{"path":845,"title":846,"description":847},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fwatch","5. 监视","Watch 是 Vue 提供的一个用于监视响应式数据变化并执行相应操作的 API，能够对响应式数据的变化做出一些操作的功能。Vue3 中的 Watch 支持多种用法，包括监视响应式对象、ref 对象、数组、函数等。",{"path":849,"title":850,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-introduction","Kafka 简介与安装",{"path":852,"title":853,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-producer-consumer","Kafka 生产者与消费者",{"path":855,"title":856,"description":857},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-springboot","Spring Boot 整合 Kafka","Spring Kafka 提供了对 Apache Kafka 的便捷集成。",{"path":859,"title":860,"description":861},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-exchange","RabbitMQ Exchange 详解","Exchange（交换机）是 RabbitMQ 的核心组件，负责接收生产者发送的消息，并根据规则将消息路由到一个或多个队列。",{"path":863,"title":864,"description":11},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-introduction","RabbitMQ 简介与安装",{"path":866,"title":867,"description":868},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-reliability","RabbitMQ 消息可靠性","消息可靠性是消息队列的核心要求，RabbitMQ 提供了多种机制来保证消息不丢失。",{"path":870,"title":871,"description":872},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-springboot","Spring Boot 整合 RabbitMQ","Spring AMQP 提供了对 RabbitMQ 的便捷集成，大大简化了开发工作。",{"path":874,"title":875,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-client","RocketMQ 客户端使用",{"path":877,"title":878,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-concepts","RocketMQ 核心概念",{"path":880,"title":881,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-installation","RocketMQ 安装部署",{"path":883,"title":884,"description":885},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-message-type","RocketMQ 消息类型","RocketMQ 支持多种消息类型，满足不同业务场景需求。",{"id":887,"title":192,"body":888,"description":193,"extension":5304,"meta":5305,"navigation":957,"path":191,"seo":5306,"stem":5307,"__hash__":5308},"docs\u002Fgolang\u002Fdistributed\u002Fmq.md",{"type":889,"value":890,"toc":5282},"minimark",[891,894,899,903,928,931,1343,1346,1685,1688,1971,1974,2439,2443,2446,2460,2463,2646,2649,3161,3165,3234,3238,3718,3722,4176,4180,4356,4359,4363,4911,4915,5278],[892,893,193],"p",{},[895,896,898],"h2",{"id":897},"kafka","Kafka",[900,901,902],"h3",{"id":902},"安装",[904,905,909],"pre",{"className":906,"code":907,"language":908,"meta":11,"style":11},"language-bash shiki shiki-themes github-light github-light github-dark","go get github.com\u002FIBM\u002Fsarama\n","bash",[910,911,912],"code",{"__ignoreMap":11},[913,914,917,921,925],"span",{"class":915,"line":916},"line",1,[913,918,920],{"class":919},"snPdu","go",[913,922,924],{"class":923},"sIIMD"," get",[913,926,927],{"class":923}," github.com\u002FIBM\u002Fsarama\n",[900,929,930],{"id":930},"生产者",[904,932,935],{"className":933,"code":934,"language":920,"meta":11,"style":11},"language-go shiki shiki-themes github-light github-light github-dark","import \"github.com\u002FIBM\u002Fsarama\"\n\nfunc NewProducer(brokers []string) (sarama.SyncProducer, error) {\n    config := sarama.NewConfig()\n    config.Producer.RequiredAcks = sarama.WaitForAll\n    config.Producer.Retry.Max = 3\n    config.Producer.Return.Successes = true\n    \n    producer, err := sarama.NewSyncProducer(brokers, config)\n    if err != nil {\n        return nil, err\n    }\n    \n    return producer, nil\n}\n\n\u002F\u002F 发送消息\nfunc SendMessage(producer sarama.SyncProducer, topic, key, value string) error {\n    msg := &sarama.ProducerMessage{\n        Topic: topic,\n        Key:   sarama.StringEncoder(key),\n        Value: sarama.StringEncoder(value),\n    }\n    \n    partition, offset, err := producer.SendMessage(msg)\n    if err != nil {\n        return err\n    }\n    \n    fmt.Printf(\"Message sent to partition %d at offset %d\\n\", partition, offset)\n    return nil\n}\n",[910,936,937,952,959,1003,1021,1033,1045,1056,1062,1078,1096,1107,1113,1118,1130,1136,1141,1148,1193,1214,1220,1232,1243,1248,1253,1270,1283,1291,1296,1301,1330,1338],{"__ignoreMap":11},[913,938,939,943,946,949],{"class":915,"line":916},[913,940,942],{"class":941},"s8jYJ","import",[913,944,945],{"class":923}," \"",[913,947,948],{"class":919},"github.com\u002FIBM\u002Fsarama",[913,950,951],{"class":923},"\"\n",[913,953,955],{"class":915,"line":954},2,[913,956,958],{"emptyLinePlaceholder":957},true,"\n",[913,960,962,965,968,972,976,979,982,985,988,991,994,997,1000],{"class":915,"line":961},3,[913,963,964],{"class":941},"func",[913,966,967],{"class":919}," NewProducer",[913,969,971],{"class":970},"sxrX7","(",[913,973,975],{"class":974},"sP4rz","brokers",[913,977,978],{"class":970}," []",[913,980,981],{"class":941},"string",[913,983,984],{"class":970},") (",[913,986,987],{"class":919},"sarama",[913,989,990],{"class":970},".",[913,992,993],{"class":919},"SyncProducer",[913,995,996],{"class":970},", ",[913,998,999],{"class":941},"error",[913,1001,1002],{"class":970},") {\n",[913,1004,1006,1009,1012,1015,1018],{"class":915,"line":1005},4,[913,1007,1008],{"class":970},"    config ",[913,1010,1011],{"class":941},":=",[913,1013,1014],{"class":970}," sarama.",[913,1016,1017],{"class":919},"NewConfig",[913,1019,1020],{"class":970},"()\n",[913,1022,1024,1027,1030],{"class":915,"line":1023},5,[913,1025,1026],{"class":970},"    config.Producer.RequiredAcks ",[913,1028,1029],{"class":941},"=",[913,1031,1032],{"class":970}," sarama.WaitForAll\n",[913,1034,1036,1039,1041],{"class":915,"line":1035},6,[913,1037,1038],{"class":970},"    config.Producer.Retry.Max ",[913,1040,1029],{"class":941},[913,1042,1044],{"class":1043},"sBjJW"," 3\n",[913,1046,1048,1051,1053],{"class":915,"line":1047},7,[913,1049,1050],{"class":970},"    config.Producer.Return.Successes ",[913,1052,1029],{"class":941},[913,1054,1055],{"class":1043}," true\n",[913,1057,1059],{"class":915,"line":1058},8,[913,1060,1061],{"class":970},"    \n",[913,1063,1065,1068,1070,1072,1075],{"class":915,"line":1064},9,[913,1066,1067],{"class":970},"    producer, err ",[913,1069,1011],{"class":941},[913,1071,1014],{"class":970},[913,1073,1074],{"class":919},"NewSyncProducer",[913,1076,1077],{"class":970},"(brokers, config)\n",[913,1079,1081,1084,1087,1090,1093],{"class":915,"line":1080},10,[913,1082,1083],{"class":941},"    if",[913,1085,1086],{"class":970}," err ",[913,1088,1089],{"class":941},"!=",[913,1091,1092],{"class":1043}," nil",[913,1094,1095],{"class":970}," {\n",[913,1097,1099,1102,1104],{"class":915,"line":1098},11,[913,1100,1101],{"class":941},"        return",[913,1103,1092],{"class":1043},[913,1105,1106],{"class":970},", err\n",[913,1108,1110],{"class":915,"line":1109},12,[913,1111,1112],{"class":970},"    }\n",[913,1114,1116],{"class":915,"line":1115},13,[913,1117,1061],{"class":970},[913,1119,1121,1124,1127],{"class":915,"line":1120},14,[913,1122,1123],{"class":941},"    return",[913,1125,1126],{"class":970}," producer, ",[913,1128,1129],{"class":1043},"nil\n",[913,1131,1133],{"class":915,"line":1132},15,[913,1134,1135],{"class":970},"}\n",[913,1137,1139],{"class":915,"line":1138},16,[913,1140,958],{"emptyLinePlaceholder":957},[913,1142,1144],{"class":915,"line":1143},17,[913,1145,1147],{"class":1146},"sCsY4","\u002F\u002F 发送消息\n",[913,1149,1151,1153,1156,1158,1161,1164,1166,1168,1170,1173,1175,1178,1180,1183,1186,1189,1191],{"class":915,"line":1150},18,[913,1152,964],{"class":941},[913,1154,1155],{"class":919}," SendMessage",[913,1157,971],{"class":970},[913,1159,1160],{"class":974},"producer",[913,1162,1163],{"class":919}," sarama",[913,1165,990],{"class":970},[913,1167,993],{"class":919},[913,1169,996],{"class":970},[913,1171,1172],{"class":974},"topic",[913,1174,996],{"class":970},[913,1176,1177],{"class":974},"key",[913,1179,996],{"class":970},[913,1181,1182],{"class":974},"value",[913,1184,1185],{"class":941}," string",[913,1187,1188],{"class":970},") ",[913,1190,999],{"class":941},[913,1192,1095],{"class":970},[913,1194,1196,1199,1201,1204,1206,1208,1211],{"class":915,"line":1195},19,[913,1197,1198],{"class":970},"    msg ",[913,1200,1011],{"class":941},[913,1202,1203],{"class":941}," &",[913,1205,987],{"class":919},[913,1207,990],{"class":970},[913,1209,1210],{"class":919},"ProducerMessage",[913,1212,1213],{"class":970},"{\n",[913,1215,1217],{"class":915,"line":1216},20,[913,1218,1219],{"class":970},"        Topic: topic,\n",[913,1221,1223,1226,1229],{"class":915,"line":1222},21,[913,1224,1225],{"class":970},"        Key:   sarama.",[913,1227,1228],{"class":919},"StringEncoder",[913,1230,1231],{"class":970},"(key),\n",[913,1233,1235,1238,1240],{"class":915,"line":1234},22,[913,1236,1237],{"class":970},"        Value: sarama.",[913,1239,1228],{"class":919},[913,1241,1242],{"class":970},"(value),\n",[913,1244,1246],{"class":915,"line":1245},23,[913,1247,1112],{"class":970},[913,1249,1251],{"class":915,"line":1250},24,[913,1252,1061],{"class":970},[913,1254,1256,1259,1261,1264,1267],{"class":915,"line":1255},25,[913,1257,1258],{"class":970},"    partition, offset, err ",[913,1260,1011],{"class":941},[913,1262,1263],{"class":970}," producer.",[913,1265,1266],{"class":919},"SendMessage",[913,1268,1269],{"class":970},"(msg)\n",[913,1271,1273,1275,1277,1279,1281],{"class":915,"line":1272},26,[913,1274,1083],{"class":941},[913,1276,1086],{"class":970},[913,1278,1089],{"class":941},[913,1280,1092],{"class":1043},[913,1282,1095],{"class":970},[913,1284,1286,1288],{"class":915,"line":1285},27,[913,1287,1101],{"class":941},[913,1289,1290],{"class":970}," err\n",[913,1292,1294],{"class":915,"line":1293},28,[913,1295,1112],{"class":970},[913,1297,1299],{"class":915,"line":1298},29,[913,1300,1061],{"class":970},[913,1302,1304,1307,1310,1312,1315,1318,1321,1324,1327],{"class":915,"line":1303},30,[913,1305,1306],{"class":970},"    fmt.",[913,1308,1309],{"class":919},"Printf",[913,1311,971],{"class":970},[913,1313,1314],{"class":923},"\"Message sent to partition ",[913,1316,1317],{"class":1043},"%d",[913,1319,1320],{"class":923}," at offset ",[913,1322,1323],{"class":1043},"%d\\n",[913,1325,1326],{"class":923},"\"",[913,1328,1329],{"class":970},", partition, offset)\n",[913,1331,1333,1335],{"class":915,"line":1332},31,[913,1334,1123],{"class":941},[913,1336,1337],{"class":1043}," nil\n",[913,1339,1341],{"class":915,"line":1340},32,[913,1342,1135],{"class":970},[900,1344,1345],{"id":1345},"异步生产者",[904,1347,1349],{"className":933,"code":1348,"language":920,"meta":11,"style":11},"func NewAsyncProducer(brokers []string) (sarama.AsyncProducer, error) {\n    config := sarama.NewConfig()\n    config.Producer.RequiredAcks = sarama.WaitForLocal\n    config.Producer.Return.Successes = true\n    config.Producer.Return.Errors = true\n    \n    producer, err := sarama.NewAsyncProducer(brokers, config)\n    if err != nil {\n        return nil, err\n    }\n    \n    \u002F\u002F 处理成功和错误\n    go func() {\n        for {\n            select {\n            case success := \u003C-producer.Successes():\n                fmt.Printf(\"Message sent: %s\\n\", success.Value)\n            case err := \u003C-producer.Errors():\n                fmt.Printf(\"Failed to send: %v\\n\", err)\n            }\n        }\n    }()\n    \n    return producer, nil\n}\n\n\u002F\u002F 发送消息\nfunc SendAsync(producer sarama.AsyncProducer, topic, value string) {\n    producer.Input() \u003C- &sarama.ProducerMessage{\n        Topic: topic,\n        Value: sarama.StringEncoder(value),\n    }\n}\n",[910,1350,1351,1381,1393,1402,1410,1419,1423,1436,1448,1456,1460,1464,1469,1480,1487,1494,1516,1536,1553,1572,1577,1582,1587,1591,1599,1603,1607,1611,1640,1664,1668,1676,1680],{"__ignoreMap":11},[913,1352,1353,1355,1358,1360,1362,1364,1366,1368,1370,1372,1375,1377,1379],{"class":915,"line":916},[913,1354,964],{"class":941},[913,1356,1357],{"class":919}," NewAsyncProducer",[913,1359,971],{"class":970},[913,1361,975],{"class":974},[913,1363,978],{"class":970},[913,1365,981],{"class":941},[913,1367,984],{"class":970},[913,1369,987],{"class":919},[913,1371,990],{"class":970},[913,1373,1374],{"class":919},"AsyncProducer",[913,1376,996],{"class":970},[913,1378,999],{"class":941},[913,1380,1002],{"class":970},[913,1382,1383,1385,1387,1389,1391],{"class":915,"line":954},[913,1384,1008],{"class":970},[913,1386,1011],{"class":941},[913,1388,1014],{"class":970},[913,1390,1017],{"class":919},[913,1392,1020],{"class":970},[913,1394,1395,1397,1399],{"class":915,"line":961},[913,1396,1026],{"class":970},[913,1398,1029],{"class":941},[913,1400,1401],{"class":970}," sarama.WaitForLocal\n",[913,1403,1404,1406,1408],{"class":915,"line":1005},[913,1405,1050],{"class":970},[913,1407,1029],{"class":941},[913,1409,1055],{"class":1043},[913,1411,1412,1415,1417],{"class":915,"line":1023},[913,1413,1414],{"class":970},"    config.Producer.Return.Errors ",[913,1416,1029],{"class":941},[913,1418,1055],{"class":1043},[913,1420,1421],{"class":915,"line":1035},[913,1422,1061],{"class":970},[913,1424,1425,1427,1429,1431,1434],{"class":915,"line":1047},[913,1426,1067],{"class":970},[913,1428,1011],{"class":941},[913,1430,1014],{"class":970},[913,1432,1433],{"class":919},"NewAsyncProducer",[913,1435,1077],{"class":970},[913,1437,1438,1440,1442,1444,1446],{"class":915,"line":1058},[913,1439,1083],{"class":941},[913,1441,1086],{"class":970},[913,1443,1089],{"class":941},[913,1445,1092],{"class":1043},[913,1447,1095],{"class":970},[913,1449,1450,1452,1454],{"class":915,"line":1064},[913,1451,1101],{"class":941},[913,1453,1092],{"class":1043},[913,1455,1106],{"class":970},[913,1457,1458],{"class":915,"line":1080},[913,1459,1112],{"class":970},[913,1461,1462],{"class":915,"line":1098},[913,1463,1061],{"class":970},[913,1465,1466],{"class":915,"line":1109},[913,1467,1468],{"class":1146},"    \u002F\u002F 处理成功和错误\n",[913,1470,1471,1474,1477],{"class":915,"line":1115},[913,1472,1473],{"class":941},"    go",[913,1475,1476],{"class":941}," func",[913,1478,1479],{"class":970},"() {\n",[913,1481,1482,1485],{"class":915,"line":1120},[913,1483,1484],{"class":941},"        for",[913,1486,1095],{"class":970},[913,1488,1489,1492],{"class":915,"line":1132},[913,1490,1491],{"class":941},"            select",[913,1493,1095],{"class":970},[913,1495,1496,1499,1502,1504,1507,1510,1513],{"class":915,"line":1138},[913,1497,1498],{"class":941},"            case",[913,1500,1501],{"class":970}," success ",[913,1503,1011],{"class":941},[913,1505,1506],{"class":941}," \u003C-",[913,1508,1509],{"class":970},"producer.",[913,1511,1512],{"class":919},"Successes",[913,1514,1515],{"class":970},"():\n",[913,1517,1518,1521,1523,1525,1528,1531,1533],{"class":915,"line":1143},[913,1519,1520],{"class":970},"                fmt.",[913,1522,1309],{"class":919},[913,1524,971],{"class":970},[913,1526,1527],{"class":923},"\"Message sent: ",[913,1529,1530],{"class":1043},"%s\\n",[913,1532,1326],{"class":923},[913,1534,1535],{"class":970},", success.Value)\n",[913,1537,1538,1540,1542,1544,1546,1548,1551],{"class":915,"line":1150},[913,1539,1498],{"class":941},[913,1541,1086],{"class":970},[913,1543,1011],{"class":941},[913,1545,1506],{"class":941},[913,1547,1509],{"class":970},[913,1549,1550],{"class":919},"Errors",[913,1552,1515],{"class":970},[913,1554,1555,1557,1559,1561,1564,1567,1569],{"class":915,"line":1195},[913,1556,1520],{"class":970},[913,1558,1309],{"class":919},[913,1560,971],{"class":970},[913,1562,1563],{"class":923},"\"Failed to send: ",[913,1565,1566],{"class":1043},"%v\\n",[913,1568,1326],{"class":923},[913,1570,1571],{"class":970},", err)\n",[913,1573,1574],{"class":915,"line":1216},[913,1575,1576],{"class":970},"            }\n",[913,1578,1579],{"class":915,"line":1222},[913,1580,1581],{"class":970},"        }\n",[913,1583,1584],{"class":915,"line":1234},[913,1585,1586],{"class":970},"    }()\n",[913,1588,1589],{"class":915,"line":1245},[913,1590,1061],{"class":970},[913,1592,1593,1595,1597],{"class":915,"line":1250},[913,1594,1123],{"class":941},[913,1596,1126],{"class":970},[913,1598,1129],{"class":1043},[913,1600,1601],{"class":915,"line":1255},[913,1602,1135],{"class":970},[913,1604,1605],{"class":915,"line":1272},[913,1606,958],{"emptyLinePlaceholder":957},[913,1608,1609],{"class":915,"line":1285},[913,1610,1147],{"class":1146},[913,1612,1613,1615,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638],{"class":915,"line":1293},[913,1614,964],{"class":941},[913,1616,1617],{"class":919}," SendAsync",[913,1619,971],{"class":970},[913,1621,1160],{"class":974},[913,1623,1163],{"class":919},[913,1625,990],{"class":970},[913,1627,1374],{"class":919},[913,1629,996],{"class":970},[913,1631,1172],{"class":974},[913,1633,996],{"class":970},[913,1635,1182],{"class":974},[913,1637,1185],{"class":941},[913,1639,1002],{"class":970},[913,1641,1642,1645,1648,1651,1654,1656,1658,1660,1662],{"class":915,"line":1298},[913,1643,1644],{"class":970},"    producer.",[913,1646,1647],{"class":919},"Input",[913,1649,1650],{"class":970},"() ",[913,1652,1653],{"class":941},"\u003C-",[913,1655,1203],{"class":941},[913,1657,987],{"class":919},[913,1659,990],{"class":970},[913,1661,1210],{"class":919},[913,1663,1213],{"class":970},[913,1665,1666],{"class":915,"line":1303},[913,1667,1219],{"class":970},[913,1669,1670,1672,1674],{"class":915,"line":1332},[913,1671,1237],{"class":970},[913,1673,1228],{"class":919},[913,1675,1242],{"class":970},[913,1677,1678],{"class":915,"line":1340},[913,1679,1112],{"class":970},[913,1681,1683],{"class":915,"line":1682},33,[913,1684,1135],{"class":970},[900,1686,1687],{"id":1687},"消费者",[904,1689,1691],{"className":933,"code":1690,"language":920,"meta":11,"style":11},"func NewConsumer(brokers []string) (sarama.Consumer, error) {\n    config := sarama.NewConfig()\n    config.Consumer.Return.Errors = true\n    \n    consumer, err := sarama.NewConsumer(brokers, config)\n    if err != nil {\n        return nil, err\n    }\n    \n    return consumer, nil\n}\n\n\u002F\u002F 消费消息\nfunc ConsumePartition(consumer sarama.Consumer, topic string, partition int32) {\n    pc, err := consumer.ConsumePartition(topic, partition, sarama.OffsetNewest)\n    if err != nil {\n        panic(err)\n    }\n    defer pc.Close()\n    \n    for msg := range pc.Messages() {\n        fmt.Printf(\"Partition: %d, Offset: %d, Key: %s, Value: %s\\n\",\n            msg.Partition, msg.Offset, msg.Key, msg.Value)\n    }\n}\n",[910,1692,1693,1723,1735,1744,1748,1762,1774,1782,1786,1790,1799,1803,1807,1812,1846,1862,1874,1882,1886,1899,1903,1923,1958,1963,1967],{"__ignoreMap":11},[913,1694,1695,1697,1700,1702,1704,1706,1708,1710,1712,1714,1717,1719,1721],{"class":915,"line":916},[913,1696,964],{"class":941},[913,1698,1699],{"class":919}," NewConsumer",[913,1701,971],{"class":970},[913,1703,975],{"class":974},[913,1705,978],{"class":970},[913,1707,981],{"class":941},[913,1709,984],{"class":970},[913,1711,987],{"class":919},[913,1713,990],{"class":970},[913,1715,1716],{"class":919},"Consumer",[913,1718,996],{"class":970},[913,1720,999],{"class":941},[913,1722,1002],{"class":970},[913,1724,1725,1727,1729,1731,1733],{"class":915,"line":954},[913,1726,1008],{"class":970},[913,1728,1011],{"class":941},[913,1730,1014],{"class":970},[913,1732,1017],{"class":919},[913,1734,1020],{"class":970},[913,1736,1737,1740,1742],{"class":915,"line":961},[913,1738,1739],{"class":970},"    config.Consumer.Return.Errors ",[913,1741,1029],{"class":941},[913,1743,1055],{"class":1043},[913,1745,1746],{"class":915,"line":1005},[913,1747,1061],{"class":970},[913,1749,1750,1753,1755,1757,1760],{"class":915,"line":1023},[913,1751,1752],{"class":970},"    consumer, err ",[913,1754,1011],{"class":941},[913,1756,1014],{"class":970},[913,1758,1759],{"class":919},"NewConsumer",[913,1761,1077],{"class":970},[913,1763,1764,1766,1768,1770,1772],{"class":915,"line":1035},[913,1765,1083],{"class":941},[913,1767,1086],{"class":970},[913,1769,1089],{"class":941},[913,1771,1092],{"class":1043},[913,1773,1095],{"class":970},[913,1775,1776,1778,1780],{"class":915,"line":1047},[913,1777,1101],{"class":941},[913,1779,1092],{"class":1043},[913,1781,1106],{"class":970},[913,1783,1784],{"class":915,"line":1058},[913,1785,1112],{"class":970},[913,1787,1788],{"class":915,"line":1064},[913,1789,1061],{"class":970},[913,1791,1792,1794,1797],{"class":915,"line":1080},[913,1793,1123],{"class":941},[913,1795,1796],{"class":970}," consumer, ",[913,1798,1129],{"class":1043},[913,1800,1801],{"class":915,"line":1098},[913,1802,1135],{"class":970},[913,1804,1805],{"class":915,"line":1109},[913,1806,958],{"emptyLinePlaceholder":957},[913,1808,1809],{"class":915,"line":1115},[913,1810,1811],{"class":1146},"\u002F\u002F 消费消息\n",[913,1813,1814,1816,1819,1821,1824,1826,1828,1830,1832,1834,1836,1838,1841,1844],{"class":915,"line":1120},[913,1815,964],{"class":941},[913,1817,1818],{"class":919}," ConsumePartition",[913,1820,971],{"class":970},[913,1822,1823],{"class":974},"consumer",[913,1825,1163],{"class":919},[913,1827,990],{"class":970},[913,1829,1716],{"class":919},[913,1831,996],{"class":970},[913,1833,1172],{"class":974},[913,1835,1185],{"class":941},[913,1837,996],{"class":970},[913,1839,1840],{"class":974},"partition",[913,1842,1843],{"class":941}," int32",[913,1845,1002],{"class":970},[913,1847,1848,1851,1853,1856,1859],{"class":915,"line":1132},[913,1849,1850],{"class":970},"    pc, err ",[913,1852,1011],{"class":941},[913,1854,1855],{"class":970}," consumer.",[913,1857,1858],{"class":919},"ConsumePartition",[913,1860,1861],{"class":970},"(topic, partition, sarama.OffsetNewest)\n",[913,1863,1864,1866,1868,1870,1872],{"class":915,"line":1138},[913,1865,1083],{"class":941},[913,1867,1086],{"class":970},[913,1869,1089],{"class":941},[913,1871,1092],{"class":1043},[913,1873,1095],{"class":970},[913,1875,1876,1879],{"class":915,"line":1143},[913,1877,1878],{"class":919},"        panic",[913,1880,1881],{"class":970},"(err)\n",[913,1883,1884],{"class":915,"line":1150},[913,1885,1112],{"class":970},[913,1887,1888,1891,1894,1897],{"class":915,"line":1195},[913,1889,1890],{"class":941},"    defer",[913,1892,1893],{"class":970}," pc.",[913,1895,1896],{"class":919},"Close",[913,1898,1020],{"class":970},[913,1900,1901],{"class":915,"line":1216},[913,1902,1061],{"class":970},[913,1904,1905,1908,1911,1913,1916,1918,1921],{"class":915,"line":1222},[913,1906,1907],{"class":941},"    for",[913,1909,1910],{"class":970}," msg ",[913,1912,1011],{"class":941},[913,1914,1915],{"class":941}," range",[913,1917,1893],{"class":970},[913,1919,1920],{"class":919},"Messages",[913,1922,1479],{"class":970},[913,1924,1925,1928,1930,1932,1935,1937,1940,1942,1945,1948,1951,1953,1955],{"class":915,"line":1234},[913,1926,1927],{"class":970},"        fmt.",[913,1929,1309],{"class":919},[913,1931,971],{"class":970},[913,1933,1934],{"class":923},"\"Partition: ",[913,1936,1317],{"class":1043},[913,1938,1939],{"class":923},", Offset: ",[913,1941,1317],{"class":1043},[913,1943,1944],{"class":923},", Key: ",[913,1946,1947],{"class":1043},"%s",[913,1949,1950],{"class":923},", Value: ",[913,1952,1530],{"class":1043},[913,1954,1326],{"class":923},[913,1956,1957],{"class":970},",\n",[913,1959,1960],{"class":915,"line":1245},[913,1961,1962],{"class":970},"            msg.Partition, msg.Offset, msg.Key, msg.Value)\n",[913,1964,1965],{"class":915,"line":1250},[913,1966,1112],{"class":970},[913,1968,1969],{"class":915,"line":1255},[913,1970,1135],{"class":970},[900,1972,1973],{"id":1973},"消费者组",[904,1975,1977],{"className":933,"code":1976,"language":920,"meta":11,"style":11},"type ConsumerGroupHandler struct{}\n\nfunc (h *ConsumerGroupHandler) Setup(sarama.ConsumerGroupSession) error   { return nil }\nfunc (h *ConsumerGroupHandler) Cleanup(sarama.ConsumerGroupSession) error { return nil }\n\nfunc (h *ConsumerGroupHandler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {\n    for msg := range claim.Messages() {\n        fmt.Printf(\"Message: %s\\n\", string(msg.Value))\n        \n        \u002F\u002F 处理消息...\n        \n        \u002F\u002F 标记消息已处理\n        session.MarkMessage(msg, \"\")\n    }\n    return nil\n}\n\nfunc StartConsumerGroup(brokers []string, groupID string, topics []string) {\n    config := sarama.NewConfig()\n    config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRoundRobin\n    config.Consumer.Offsets.Initial = sarama.OffsetNewest\n    \n    group, err := sarama.NewConsumerGroup(brokers, groupID, config)\n    if err != nil {\n        panic(err)\n    }\n    defer group.Close()\n    \n    handler := &ConsumerGroupHandler{}\n    \n    ctx := context.Background()\n    for {\n        if err := group.Consume(ctx, topics, handler); err != nil {\n            fmt.Printf(\"Error: %v\\n\", err)\n        }\n    }\n}\n",[910,1978,1979,1993,1997,2042,2080,2084,2130,2147,2169,2174,2179,2183,2188,2205,2209,2215,2219,2223,2256,2268,2278,2288,2292,2307,2319,2325,2329,2340,2344,2357,2361,2376,2382,2405,2424,2429,2434],{"__ignoreMap":11},[913,1980,1981,1984,1987,1990],{"class":915,"line":916},[913,1982,1983],{"class":941},"type",[913,1985,1986],{"class":919}," ConsumerGroupHandler",[913,1988,1989],{"class":941}," struct",[913,1991,1992],{"class":970},"{}\n",[913,1994,1995],{"class":915,"line":954},[913,1996,958],{"emptyLinePlaceholder":957},[913,1998,1999,2001,2004,2007,2010,2013,2015,2018,2020,2022,2024,2027,2029,2031,2034,2037,2039],{"class":915,"line":961},[913,2000,964],{"class":941},[913,2002,2003],{"class":970}," (",[913,2005,2006],{"class":974},"h ",[913,2008,2009],{"class":941},"*",[913,2011,2012],{"class":919},"ConsumerGroupHandler",[913,2014,1188],{"class":970},[913,2016,2017],{"class":919},"Setup",[913,2019,971],{"class":970},[913,2021,987],{"class":919},[913,2023,990],{"class":970},[913,2025,2026],{"class":919},"ConsumerGroupSession",[913,2028,1188],{"class":970},[913,2030,999],{"class":941},[913,2032,2033],{"class":970},"   { ",[913,2035,2036],{"class":941},"return",[913,2038,1092],{"class":1043},[913,2040,2041],{"class":970}," }\n",[913,2043,2044,2046,2048,2050,2052,2054,2056,2059,2061,2063,2065,2067,2069,2071,2074,2076,2078],{"class":915,"line":1005},[913,2045,964],{"class":941},[913,2047,2003],{"class":970},[913,2049,2006],{"class":974},[913,2051,2009],{"class":941},[913,2053,2012],{"class":919},[913,2055,1188],{"class":970},[913,2057,2058],{"class":919},"Cleanup",[913,2060,971],{"class":970},[913,2062,987],{"class":919},[913,2064,990],{"class":970},[913,2066,2026],{"class":919},[913,2068,1188],{"class":970},[913,2070,999],{"class":941},[913,2072,2073],{"class":970}," { ",[913,2075,2036],{"class":941},[913,2077,1092],{"class":1043},[913,2079,2041],{"class":970},[913,2081,2082],{"class":915,"line":1023},[913,2083,958],{"emptyLinePlaceholder":957},[913,2085,2086,2088,2090,2092,2094,2096,2098,2101,2103,2106,2108,2110,2112,2114,2117,2119,2121,2124,2126,2128],{"class":915,"line":1035},[913,2087,964],{"class":941},[913,2089,2003],{"class":970},[913,2091,2006],{"class":974},[913,2093,2009],{"class":941},[913,2095,2012],{"class":919},[913,2097,1188],{"class":970},[913,2099,2100],{"class":919},"ConsumeClaim",[913,2102,971],{"class":970},[913,2104,2105],{"class":974},"session",[913,2107,1163],{"class":919},[913,2109,990],{"class":970},[913,2111,2026],{"class":919},[913,2113,996],{"class":970},[913,2115,2116],{"class":974},"claim",[913,2118,1163],{"class":919},[913,2120,990],{"class":970},[913,2122,2123],{"class":919},"ConsumerGroupClaim",[913,2125,1188],{"class":970},[913,2127,999],{"class":941},[913,2129,1095],{"class":970},[913,2131,2132,2134,2136,2138,2140,2143,2145],{"class":915,"line":1047},[913,2133,1907],{"class":941},[913,2135,1910],{"class":970},[913,2137,1011],{"class":941},[913,2139,1915],{"class":941},[913,2141,2142],{"class":970}," claim.",[913,2144,1920],{"class":919},[913,2146,1479],{"class":970},[913,2148,2149,2151,2153,2155,2158,2160,2162,2164,2166],{"class":915,"line":1058},[913,2150,1927],{"class":970},[913,2152,1309],{"class":919},[913,2154,971],{"class":970},[913,2156,2157],{"class":923},"\"Message: ",[913,2159,1530],{"class":1043},[913,2161,1326],{"class":923},[913,2163,996],{"class":970},[913,2165,981],{"class":941},[913,2167,2168],{"class":970},"(msg.Value))\n",[913,2170,2171],{"class":915,"line":1064},[913,2172,2173],{"class":970},"        \n",[913,2175,2176],{"class":915,"line":1080},[913,2177,2178],{"class":1146},"        \u002F\u002F 处理消息...\n",[913,2180,2181],{"class":915,"line":1098},[913,2182,2173],{"class":970},[913,2184,2185],{"class":915,"line":1109},[913,2186,2187],{"class":1146},"        \u002F\u002F 标记消息已处理\n",[913,2189,2190,2193,2196,2199,2202],{"class":915,"line":1115},[913,2191,2192],{"class":970},"        session.",[913,2194,2195],{"class":919},"MarkMessage",[913,2197,2198],{"class":970},"(msg, ",[913,2200,2201],{"class":923},"\"\"",[913,2203,2204],{"class":970},")\n",[913,2206,2207],{"class":915,"line":1120},[913,2208,1112],{"class":970},[913,2210,2211,2213],{"class":915,"line":1132},[913,2212,1123],{"class":941},[913,2214,1337],{"class":1043},[913,2216,2217],{"class":915,"line":1138},[913,2218,1135],{"class":970},[913,2220,2221],{"class":915,"line":1143},[913,2222,958],{"emptyLinePlaceholder":957},[913,2224,2225,2227,2230,2232,2234,2236,2238,2240,2243,2245,2247,2250,2252,2254],{"class":915,"line":1150},[913,2226,964],{"class":941},[913,2228,2229],{"class":919}," StartConsumerGroup",[913,2231,971],{"class":970},[913,2233,975],{"class":974},[913,2235,978],{"class":970},[913,2237,981],{"class":941},[913,2239,996],{"class":970},[913,2241,2242],{"class":974},"groupID",[913,2244,1185],{"class":941},[913,2246,996],{"class":970},[913,2248,2249],{"class":974},"topics",[913,2251,978],{"class":970},[913,2253,981],{"class":941},[913,2255,1002],{"class":970},[913,2257,2258,2260,2262,2264,2266],{"class":915,"line":1195},[913,2259,1008],{"class":970},[913,2261,1011],{"class":941},[913,2263,1014],{"class":970},[913,2265,1017],{"class":919},[913,2267,1020],{"class":970},[913,2269,2270,2273,2275],{"class":915,"line":1216},[913,2271,2272],{"class":970},"    config.Consumer.Group.Rebalance.Strategy ",[913,2274,1029],{"class":941},[913,2276,2277],{"class":970}," sarama.BalanceStrategyRoundRobin\n",[913,2279,2280,2283,2285],{"class":915,"line":1222},[913,2281,2282],{"class":970},"    config.Consumer.Offsets.Initial ",[913,2284,1029],{"class":941},[913,2286,2287],{"class":970}," sarama.OffsetNewest\n",[913,2289,2290],{"class":915,"line":1234},[913,2291,1061],{"class":970},[913,2293,2294,2297,2299,2301,2304],{"class":915,"line":1245},[913,2295,2296],{"class":970},"    group, err ",[913,2298,1011],{"class":941},[913,2300,1014],{"class":970},[913,2302,2303],{"class":919},"NewConsumerGroup",[913,2305,2306],{"class":970},"(brokers, groupID, config)\n",[913,2308,2309,2311,2313,2315,2317],{"class":915,"line":1250},[913,2310,1083],{"class":941},[913,2312,1086],{"class":970},[913,2314,1089],{"class":941},[913,2316,1092],{"class":1043},[913,2318,1095],{"class":970},[913,2320,2321,2323],{"class":915,"line":1255},[913,2322,1878],{"class":919},[913,2324,1881],{"class":970},[913,2326,2327],{"class":915,"line":1272},[913,2328,1112],{"class":970},[913,2330,2331,2333,2336,2338],{"class":915,"line":1285},[913,2332,1890],{"class":941},[913,2334,2335],{"class":970}," group.",[913,2337,1896],{"class":919},[913,2339,1020],{"class":970},[913,2341,2342],{"class":915,"line":1293},[913,2343,1061],{"class":970},[913,2345,2346,2349,2351,2353,2355],{"class":915,"line":1298},[913,2347,2348],{"class":970},"    handler ",[913,2350,1011],{"class":941},[913,2352,1203],{"class":941},[913,2354,2012],{"class":919},[913,2356,1992],{"class":970},[913,2358,2359],{"class":915,"line":1303},[913,2360,1061],{"class":970},[913,2362,2363,2366,2368,2371,2374],{"class":915,"line":1332},[913,2364,2365],{"class":970},"    ctx ",[913,2367,1011],{"class":941},[913,2369,2370],{"class":970}," context.",[913,2372,2373],{"class":919},"Background",[913,2375,1020],{"class":970},[913,2377,2378,2380],{"class":915,"line":1340},[913,2379,1907],{"class":941},[913,2381,1095],{"class":970},[913,2383,2384,2387,2389,2391,2393,2396,2399,2401,2403],{"class":915,"line":1682},[913,2385,2386],{"class":941},"        if",[913,2388,1086],{"class":970},[913,2390,1011],{"class":941},[913,2392,2335],{"class":970},[913,2394,2395],{"class":919},"Consume",[913,2397,2398],{"class":970},"(ctx, topics, handler); err ",[913,2400,1089],{"class":941},[913,2402,1092],{"class":1043},[913,2404,1095],{"class":970},[913,2406,2408,2411,2413,2415,2418,2420,2422],{"class":915,"line":2407},34,[913,2409,2410],{"class":970},"            fmt.",[913,2412,1309],{"class":919},[913,2414,971],{"class":970},[913,2416,2417],{"class":923},"\"Error: ",[913,2419,1566],{"class":1043},[913,2421,1326],{"class":923},[913,2423,1571],{"class":970},[913,2425,2427],{"class":915,"line":2426},35,[913,2428,1581],{"class":970},[913,2430,2432],{"class":915,"line":2431},36,[913,2433,1112],{"class":970},[913,2435,2437],{"class":915,"line":2436},37,[913,2438,1135],{"class":970},[895,2440,2442],{"id":2441},"rabbitmq","RabbitMQ",[900,2444,902],{"id":2445},"安装-1",[904,2447,2449],{"className":906,"code":2448,"language":908,"meta":11,"style":11},"go get github.com\u002Frabbitmq\u002Famqp091-go\n",[910,2450,2451],{"__ignoreMap":11},[913,2452,2453,2455,2457],{"class":915,"line":916},[913,2454,920],{"class":919},[913,2456,924],{"class":923},[913,2458,2459],{"class":923}," github.com\u002Frabbitmq\u002Famqp091-go\n",[900,2461,2462],{"id":2462},"连接",[904,2464,2466],{"className":933,"code":2465,"language":920,"meta":11,"style":11},"import amqp \"github.com\u002Frabbitmq\u002Famqp091-go\"\n\nfunc NewConnection(url string) (*amqp.Connection, *amqp.Channel, error) {\n    conn, err := amqp.Dial(url)\n    if err != nil {\n        return nil, nil, err\n    }\n    \n    ch, err := conn.Channel()\n    if err != nil {\n        conn.Close()\n        return nil, nil, err\n    }\n    \n    return conn, ch, nil\n}\n",[910,2467,2468,2482,2486,2529,2545,2557,2570,2574,2578,2592,2604,2613,2625,2629,2633,2642],{"__ignoreMap":11},[913,2469,2470,2472,2475,2477,2480],{"class":915,"line":916},[913,2471,942],{"class":941},[913,2473,2474],{"class":970}," amqp ",[913,2476,1326],{"class":923},[913,2478,2479],{"class":919},"github.com\u002Frabbitmq\u002Famqp091-go",[913,2481,951],{"class":923},[913,2483,2484],{"class":915,"line":954},[913,2485,958],{"emptyLinePlaceholder":957},[913,2487,2488,2490,2493,2495,2498,2500,2502,2504,2507,2509,2512,2514,2516,2518,2520,2523,2525,2527],{"class":915,"line":961},[913,2489,964],{"class":941},[913,2491,2492],{"class":919}," NewConnection",[913,2494,971],{"class":970},[913,2496,2497],{"class":974},"url",[913,2499,1185],{"class":941},[913,2501,984],{"class":970},[913,2503,2009],{"class":941},[913,2505,2506],{"class":919},"amqp",[913,2508,990],{"class":970},[913,2510,2511],{"class":919},"Connection",[913,2513,996],{"class":970},[913,2515,2009],{"class":941},[913,2517,2506],{"class":919},[913,2519,990],{"class":970},[913,2521,2522],{"class":919},"Channel",[913,2524,996],{"class":970},[913,2526,999],{"class":941},[913,2528,1002],{"class":970},[913,2530,2531,2534,2536,2539,2542],{"class":915,"line":1005},[913,2532,2533],{"class":970},"    conn, err ",[913,2535,1011],{"class":941},[913,2537,2538],{"class":970}," amqp.",[913,2540,2541],{"class":919},"Dial",[913,2543,2544],{"class":970},"(url)\n",[913,2546,2547,2549,2551,2553,2555],{"class":915,"line":1023},[913,2548,1083],{"class":941},[913,2550,1086],{"class":970},[913,2552,1089],{"class":941},[913,2554,1092],{"class":1043},[913,2556,1095],{"class":970},[913,2558,2559,2561,2563,2565,2568],{"class":915,"line":1035},[913,2560,1101],{"class":941},[913,2562,1092],{"class":1043},[913,2564,996],{"class":970},[913,2566,2567],{"class":1043},"nil",[913,2569,1106],{"class":970},[913,2571,2572],{"class":915,"line":1047},[913,2573,1112],{"class":970},[913,2575,2576],{"class":915,"line":1058},[913,2577,1061],{"class":970},[913,2579,2580,2583,2585,2588,2590],{"class":915,"line":1064},[913,2581,2582],{"class":970},"    ch, err ",[913,2584,1011],{"class":941},[913,2586,2587],{"class":970}," conn.",[913,2589,2522],{"class":919},[913,2591,1020],{"class":970},[913,2593,2594,2596,2598,2600,2602],{"class":915,"line":1080},[913,2595,1083],{"class":941},[913,2597,1086],{"class":970},[913,2599,1089],{"class":941},[913,2601,1092],{"class":1043},[913,2603,1095],{"class":970},[913,2605,2606,2609,2611],{"class":915,"line":1098},[913,2607,2608],{"class":970},"        conn.",[913,2610,1896],{"class":919},[913,2612,1020],{"class":970},[913,2614,2615,2617,2619,2621,2623],{"class":915,"line":1109},[913,2616,1101],{"class":941},[913,2618,1092],{"class":1043},[913,2620,996],{"class":970},[913,2622,2567],{"class":1043},[913,2624,1106],{"class":970},[913,2626,2627],{"class":915,"line":1115},[913,2628,1112],{"class":970},[913,2630,2631],{"class":915,"line":1120},[913,2632,1061],{"class":970},[913,2634,2635,2637,2640],{"class":915,"line":1132},[913,2636,1123],{"class":941},[913,2638,2639],{"class":970}," conn, ch, ",[913,2641,1129],{"class":1043},[913,2643,2644],{"class":915,"line":1138},[913,2645,1135],{"class":970},[900,2647,2648],{"id":2648},"简单队列",[904,2650,2652],{"className":933,"code":2651,"language":920,"meta":11,"style":11},"\u002F\u002F 声明队列\nfunc DeclareQueue(ch *amqp.Channel, name string) (amqp.Queue, error) {\n    return ch.QueueDeclare(\n        name,  \u002F\u002F 队列名\n        true,  \u002F\u002F 持久化\n        false, \u002F\u002F 自动删除\n        false, \u002F\u002F 排他\n        false, \u002F\u002F 不等待\n        nil,   \u002F\u002F 参数\n    )\n}\n\n\u002F\u002F 发送消息\nfunc Publish(ch *amqp.Channel, queue, message string) error {\n    return ch.PublishWithContext(\n        context.Background(),\n        \"\",    \u002F\u002F exchange\n        queue, \u002F\u002F routing key\n        false, \u002F\u002F mandatory\n        false, \u002F\u002F immediate\n        amqp.Publishing{\n            DeliveryMode: amqp.Persistent,\n            ContentType:  \"text\u002Fplain\",\n            Body:         []byte(message),\n        },\n    )\n}\n\n\u002F\u002F 消费消息\nfunc Consume(ch *amqp.Channel, queue string) {\n    msgs, err := ch.Consume(\n        queue, \u002F\u002F queue\n        \"\",    \u002F\u002F consumer\n        false, \u002F\u002F auto-ack\n        false, \u002F\u002F exclusive\n        false, \u002F\u002F no-local\n        false, \u002F\u002F no-wait\n        nil,   \u002F\u002F args\n    )\n    if err != nil {\n        panic(err)\n    }\n    \n    for msg := range msgs {\n        fmt.Printf(\"Received: %s\\n\", msg.Body)\n        \n        \u002F\u002F 处理消息...\n        \n        \u002F\u002F 确认消息\n        msg.Ack(false)\n    }\n}\n",[910,2653,2654,2659,2702,2715,2723,2734,2744,2753,2762,2773,2778,2782,2786,2790,2827,2838,2848,2859,2867,2876,2885,2897,2902,2912,2923,2928,2932,2936,2940,2944,2971,2984,2991,3000,3009,3018,3027,3036,3046,3051,3064,3071,3076,3081,3095,3114,3119,3124,3129,3135,3151,3156],{"__ignoreMap":11},[913,2655,2656],{"class":915,"line":916},[913,2657,2658],{"class":1146},"\u002F\u002F 声明队列\n",[913,2660,2661,2663,2666,2668,2671,2674,2676,2678,2680,2682,2685,2687,2689,2691,2693,2696,2698,2700],{"class":915,"line":954},[913,2662,964],{"class":941},[913,2664,2665],{"class":919}," DeclareQueue",[913,2667,971],{"class":970},[913,2669,2670],{"class":974},"ch",[913,2672,2673],{"class":941}," *",[913,2675,2506],{"class":919},[913,2677,990],{"class":970},[913,2679,2522],{"class":919},[913,2681,996],{"class":970},[913,2683,2684],{"class":974},"name",[913,2686,1185],{"class":941},[913,2688,984],{"class":970},[913,2690,2506],{"class":919},[913,2692,990],{"class":970},[913,2694,2695],{"class":919},"Queue",[913,2697,996],{"class":970},[913,2699,999],{"class":941},[913,2701,1002],{"class":970},[913,2703,2704,2706,2709,2712],{"class":915,"line":961},[913,2705,1123],{"class":941},[913,2707,2708],{"class":970}," ch.",[913,2710,2711],{"class":919},"QueueDeclare",[913,2713,2714],{"class":970},"(\n",[913,2716,2717,2720],{"class":915,"line":1005},[913,2718,2719],{"class":970},"        name,  ",[913,2721,2722],{"class":1146},"\u002F\u002F 队列名\n",[913,2724,2725,2728,2731],{"class":915,"line":1023},[913,2726,2727],{"class":1043},"        true",[913,2729,2730],{"class":970},",  ",[913,2732,2733],{"class":1146},"\u002F\u002F 持久化\n",[913,2735,2736,2739,2741],{"class":915,"line":1035},[913,2737,2738],{"class":1043},"        false",[913,2740,996],{"class":970},[913,2742,2743],{"class":1146},"\u002F\u002F 自动删除\n",[913,2745,2746,2748,2750],{"class":915,"line":1047},[913,2747,2738],{"class":1043},[913,2749,996],{"class":970},[913,2751,2752],{"class":1146},"\u002F\u002F 排他\n",[913,2754,2755,2757,2759],{"class":915,"line":1058},[913,2756,2738],{"class":1043},[913,2758,996],{"class":970},[913,2760,2761],{"class":1146},"\u002F\u002F 不等待\n",[913,2763,2764,2767,2770],{"class":915,"line":1064},[913,2765,2766],{"class":1043},"        nil",[913,2768,2769],{"class":970},",   ",[913,2771,2772],{"class":1146},"\u002F\u002F 参数\n",[913,2774,2775],{"class":915,"line":1080},[913,2776,2777],{"class":970},"    )\n",[913,2779,2780],{"class":915,"line":1098},[913,2781,1135],{"class":970},[913,2783,2784],{"class":915,"line":1109},[913,2785,958],{"emptyLinePlaceholder":957},[913,2787,2788],{"class":915,"line":1115},[913,2789,1147],{"class":1146},[913,2791,2792,2794,2797,2799,2801,2803,2805,2807,2809,2811,2814,2816,2819,2821,2823,2825],{"class":915,"line":1120},[913,2793,964],{"class":941},[913,2795,2796],{"class":919}," Publish",[913,2798,971],{"class":970},[913,2800,2670],{"class":974},[913,2802,2673],{"class":941},[913,2804,2506],{"class":919},[913,2806,990],{"class":970},[913,2808,2522],{"class":919},[913,2810,996],{"class":970},[913,2812,2813],{"class":974},"queue",[913,2815,996],{"class":970},[913,2817,2818],{"class":974},"message",[913,2820,1185],{"class":941},[913,2822,1188],{"class":970},[913,2824,999],{"class":941},[913,2826,1095],{"class":970},[913,2828,2829,2831,2833,2836],{"class":915,"line":1132},[913,2830,1123],{"class":941},[913,2832,2708],{"class":970},[913,2834,2835],{"class":919},"PublishWithContext",[913,2837,2714],{"class":970},[913,2839,2840,2843,2845],{"class":915,"line":1138},[913,2841,2842],{"class":970},"        context.",[913,2844,2373],{"class":919},[913,2846,2847],{"class":970},"(),\n",[913,2849,2850,2853,2856],{"class":915,"line":1143},[913,2851,2852],{"class":923},"        \"\"",[913,2854,2855],{"class":970},",    ",[913,2857,2858],{"class":1146},"\u002F\u002F exchange\n",[913,2860,2861,2864],{"class":915,"line":1150},[913,2862,2863],{"class":970},"        queue, ",[913,2865,2866],{"class":1146},"\u002F\u002F routing key\n",[913,2868,2869,2871,2873],{"class":915,"line":1195},[913,2870,2738],{"class":1043},[913,2872,996],{"class":970},[913,2874,2875],{"class":1146},"\u002F\u002F mandatory\n",[913,2877,2878,2880,2882],{"class":915,"line":1216},[913,2879,2738],{"class":1043},[913,2881,996],{"class":970},[913,2883,2884],{"class":1146},"\u002F\u002F immediate\n",[913,2886,2887,2890,2892,2895],{"class":915,"line":1222},[913,2888,2889],{"class":919},"        amqp",[913,2891,990],{"class":970},[913,2893,2894],{"class":919},"Publishing",[913,2896,1213],{"class":970},[913,2898,2899],{"class":915,"line":1234},[913,2900,2901],{"class":970},"            DeliveryMode: amqp.Persistent,\n",[913,2903,2904,2907,2910],{"class":915,"line":1245},[913,2905,2906],{"class":970},"            ContentType:  ",[913,2908,2909],{"class":923},"\"text\u002Fplain\"",[913,2911,1957],{"class":970},[913,2913,2914,2917,2920],{"class":915,"line":1250},[913,2915,2916],{"class":970},"            Body:         []",[913,2918,2919],{"class":941},"byte",[913,2921,2922],{"class":970},"(message),\n",[913,2924,2925],{"class":915,"line":1255},[913,2926,2927],{"class":970},"        },\n",[913,2929,2930],{"class":915,"line":1272},[913,2931,2777],{"class":970},[913,2933,2934],{"class":915,"line":1285},[913,2935,1135],{"class":970},[913,2937,2938],{"class":915,"line":1293},[913,2939,958],{"emptyLinePlaceholder":957},[913,2941,2942],{"class":915,"line":1298},[913,2943,1811],{"class":1146},[913,2945,2946,2948,2951,2953,2955,2957,2959,2961,2963,2965,2967,2969],{"class":915,"line":1303},[913,2947,964],{"class":941},[913,2949,2950],{"class":919}," Consume",[913,2952,971],{"class":970},[913,2954,2670],{"class":974},[913,2956,2673],{"class":941},[913,2958,2506],{"class":919},[913,2960,990],{"class":970},[913,2962,2522],{"class":919},[913,2964,996],{"class":970},[913,2966,2813],{"class":974},[913,2968,1185],{"class":941},[913,2970,1002],{"class":970},[913,2972,2973,2976,2978,2980,2982],{"class":915,"line":1332},[913,2974,2975],{"class":970},"    msgs, err ",[913,2977,1011],{"class":941},[913,2979,2708],{"class":970},[913,2981,2395],{"class":919},[913,2983,2714],{"class":970},[913,2985,2986,2988],{"class":915,"line":1340},[913,2987,2863],{"class":970},[913,2989,2990],{"class":1146},"\u002F\u002F queue\n",[913,2992,2993,2995,2997],{"class":915,"line":1682},[913,2994,2852],{"class":923},[913,2996,2855],{"class":970},[913,2998,2999],{"class":1146},"\u002F\u002F consumer\n",[913,3001,3002,3004,3006],{"class":915,"line":2407},[913,3003,2738],{"class":1043},[913,3005,996],{"class":970},[913,3007,3008],{"class":1146},"\u002F\u002F auto-ack\n",[913,3010,3011,3013,3015],{"class":915,"line":2426},[913,3012,2738],{"class":1043},[913,3014,996],{"class":970},[913,3016,3017],{"class":1146},"\u002F\u002F exclusive\n",[913,3019,3020,3022,3024],{"class":915,"line":2431},[913,3021,2738],{"class":1043},[913,3023,996],{"class":970},[913,3025,3026],{"class":1146},"\u002F\u002F no-local\n",[913,3028,3029,3031,3033],{"class":915,"line":2436},[913,3030,2738],{"class":1043},[913,3032,996],{"class":970},[913,3034,3035],{"class":1146},"\u002F\u002F no-wait\n",[913,3037,3039,3041,3043],{"class":915,"line":3038},38,[913,3040,2766],{"class":1043},[913,3042,2769],{"class":970},[913,3044,3045],{"class":1146},"\u002F\u002F args\n",[913,3047,3049],{"class":915,"line":3048},39,[913,3050,2777],{"class":970},[913,3052,3054,3056,3058,3060,3062],{"class":915,"line":3053},40,[913,3055,1083],{"class":941},[913,3057,1086],{"class":970},[913,3059,1089],{"class":941},[913,3061,1092],{"class":1043},[913,3063,1095],{"class":970},[913,3065,3067,3069],{"class":915,"line":3066},41,[913,3068,1878],{"class":919},[913,3070,1881],{"class":970},[913,3072,3074],{"class":915,"line":3073},42,[913,3075,1112],{"class":970},[913,3077,3079],{"class":915,"line":3078},43,[913,3080,1061],{"class":970},[913,3082,3084,3086,3088,3090,3092],{"class":915,"line":3083},44,[913,3085,1907],{"class":941},[913,3087,1910],{"class":970},[913,3089,1011],{"class":941},[913,3091,1915],{"class":941},[913,3093,3094],{"class":970}," msgs {\n",[913,3096,3098,3100,3102,3104,3107,3109,3111],{"class":915,"line":3097},45,[913,3099,1927],{"class":970},[913,3101,1309],{"class":919},[913,3103,971],{"class":970},[913,3105,3106],{"class":923},"\"Received: ",[913,3108,1530],{"class":1043},[913,3110,1326],{"class":923},[913,3112,3113],{"class":970},", msg.Body)\n",[913,3115,3117],{"class":915,"line":3116},46,[913,3118,2173],{"class":970},[913,3120,3122],{"class":915,"line":3121},47,[913,3123,2178],{"class":1146},[913,3125,3127],{"class":915,"line":3126},48,[913,3128,2173],{"class":970},[913,3130,3132],{"class":915,"line":3131},49,[913,3133,3134],{"class":1146},"        \u002F\u002F 确认消息\n",[913,3136,3138,3141,3144,3146,3149],{"class":915,"line":3137},50,[913,3139,3140],{"class":970},"        msg.",[913,3142,3143],{"class":919},"Ack",[913,3145,971],{"class":970},[913,3147,3148],{"class":1043},"false",[913,3150,2204],{"class":970},[913,3152,3154],{"class":915,"line":3153},51,[913,3155,1112],{"class":970},[913,3157,3159],{"class":915,"line":3158},52,[913,3160,1135],{"class":970},[900,3162,3164],{"id":3163},"工作队列公平分发","工作队列（公平分发）",[904,3166,3168],{"className":933,"code":3167,"language":920,"meta":11,"style":11},"\u002F\u002F 设置 QoS\nch.Qos(\n    1,     \u002F\u002F prefetch count\n    0,     \u002F\u002F prefetch size\n    false, \u002F\u002F global\n)\n\n\u002F\u002F 多个消费者消费同一个队列\n\u002F\u002F 消息会轮询分发给各个消费者\n",[910,3169,3170,3175,3185,3196,3206,3216,3220,3224,3229],{"__ignoreMap":11},[913,3171,3172],{"class":915,"line":916},[913,3173,3174],{"class":1146},"\u002F\u002F 设置 QoS\n",[913,3176,3177,3180,3183],{"class":915,"line":954},[913,3178,3179],{"class":970},"ch.",[913,3181,3182],{"class":919},"Qos",[913,3184,2714],{"class":970},[913,3186,3187,3190,3193],{"class":915,"line":961},[913,3188,3189],{"class":1043},"    1",[913,3191,3192],{"class":970},",     ",[913,3194,3195],{"class":1146},"\u002F\u002F prefetch count\n",[913,3197,3198,3201,3203],{"class":915,"line":1005},[913,3199,3200],{"class":1043},"    0",[913,3202,3192],{"class":970},[913,3204,3205],{"class":1146},"\u002F\u002F prefetch size\n",[913,3207,3208,3211,3213],{"class":915,"line":1023},[913,3209,3210],{"class":1043},"    false",[913,3212,996],{"class":970},[913,3214,3215],{"class":1146},"\u002F\u002F global\n",[913,3217,3218],{"class":915,"line":1035},[913,3219,2204],{"class":970},[913,3221,3222],{"class":915,"line":1047},[913,3223,958],{"emptyLinePlaceholder":957},[913,3225,3226],{"class":915,"line":1058},[913,3227,3228],{"class":1146},"\u002F\u002F 多个消费者消费同一个队列\n",[913,3230,3231],{"class":915,"line":1064},[913,3232,3233],{"class":1146},"\u002F\u002F 消息会轮询分发给各个消费者\n",[900,3235,3237],{"id":3236},"发布订阅fanout","发布\u002F订阅（Fanout）",[904,3239,3241],{"className":933,"code":3240,"language":920,"meta":11,"style":11},"\u002F\u002F 声明 Exchange\nfunc DeclareExchange(ch *amqp.Channel, name, kind string) error {\n    return ch.ExchangeDeclare(\n        name,  \u002F\u002F name\n        kind,  \u002F\u002F type: fanout, direct, topic, headers\n        true,  \u002F\u002F durable\n        false, \u002F\u002F auto-deleted\n        false, \u002F\u002F internal\n        false, \u002F\u002F no-wait\n        nil,   \u002F\u002F arguments\n    )\n}\n\n\u002F\u002F 发布者\nfunc PublishToExchange(ch *amqp.Channel, exchange, message string) error {\n    return ch.PublishWithContext(\n        context.Background(),\n        exchange, \u002F\u002F exchange\n        \"\",       \u002F\u002F routing key（fanout 忽略）\n        false,\n        false,\n        amqp.Publishing{\n            ContentType: \"text\u002Fplain\",\n            Body:        []byte(message),\n        },\n    )\n}\n\n\u002F\u002F 订阅者\nfunc Subscribe(ch *amqp.Channel, exchange string) {\n    \u002F\u002F 声明临时队列\n    q, _ := ch.QueueDeclare(\n        \"\",    \u002F\u002F 随机队列名\n        false, \u002F\u002F 非持久化\n        true,  \u002F\u002F 自动删除\n        true,  \u002F\u002F 排他\n        false,\n        nil,\n    )\n    \n    \u002F\u002F 绑定到 Exchange\n    ch.QueueBind(q.Name, \"\", exchange, false, nil)\n    \n    \u002F\u002F 消费\n    msgs, _ := ch.Consume(q.Name, \"\", true, false, false, false, nil)\n    \n    for msg := range msgs {\n        fmt.Printf(\"Received: %s\\n\", msg.Body)\n    }\n}\n",[910,3242,3243,3248,3284,3295,3302,3310,3319,3328,3337,3345,3354,3358,3362,3366,3371,3407,3417,3425,3432,3442,3448,3454,3464,3473,3482,3486,3490,3494,3498,3503,3530,3535,3548,3557,3566,3574,3582,3588,3594,3598,3602,3607,3631,3635,3640,3678,3682,3694,3710,3714],{"__ignoreMap":11},[913,3244,3245],{"class":915,"line":916},[913,3246,3247],{"class":1146},"\u002F\u002F 声明 Exchange\n",[913,3249,3250,3252,3255,3257,3259,3261,3263,3265,3267,3269,3271,3273,3276,3278,3280,3282],{"class":915,"line":954},[913,3251,964],{"class":941},[913,3253,3254],{"class":919}," DeclareExchange",[913,3256,971],{"class":970},[913,3258,2670],{"class":974},[913,3260,2673],{"class":941},[913,3262,2506],{"class":919},[913,3264,990],{"class":970},[913,3266,2522],{"class":919},[913,3268,996],{"class":970},[913,3270,2684],{"class":974},[913,3272,996],{"class":970},[913,3274,3275],{"class":974},"kind",[913,3277,1185],{"class":941},[913,3279,1188],{"class":970},[913,3281,999],{"class":941},[913,3283,1095],{"class":970},[913,3285,3286,3288,3290,3293],{"class":915,"line":961},[913,3287,1123],{"class":941},[913,3289,2708],{"class":970},[913,3291,3292],{"class":919},"ExchangeDeclare",[913,3294,2714],{"class":970},[913,3296,3297,3299],{"class":915,"line":1005},[913,3298,2719],{"class":970},[913,3300,3301],{"class":1146},"\u002F\u002F name\n",[913,3303,3304,3307],{"class":915,"line":1023},[913,3305,3306],{"class":970},"        kind,  ",[913,3308,3309],{"class":1146},"\u002F\u002F type: fanout, direct, topic, headers\n",[913,3311,3312,3314,3316],{"class":915,"line":1035},[913,3313,2727],{"class":1043},[913,3315,2730],{"class":970},[913,3317,3318],{"class":1146},"\u002F\u002F durable\n",[913,3320,3321,3323,3325],{"class":915,"line":1047},[913,3322,2738],{"class":1043},[913,3324,996],{"class":970},[913,3326,3327],{"class":1146},"\u002F\u002F auto-deleted\n",[913,3329,3330,3332,3334],{"class":915,"line":1058},[913,3331,2738],{"class":1043},[913,3333,996],{"class":970},[913,3335,3336],{"class":1146},"\u002F\u002F internal\n",[913,3338,3339,3341,3343],{"class":915,"line":1064},[913,3340,2738],{"class":1043},[913,3342,996],{"class":970},[913,3344,3035],{"class":1146},[913,3346,3347,3349,3351],{"class":915,"line":1080},[913,3348,2766],{"class":1043},[913,3350,2769],{"class":970},[913,3352,3353],{"class":1146},"\u002F\u002F arguments\n",[913,3355,3356],{"class":915,"line":1098},[913,3357,2777],{"class":970},[913,3359,3360],{"class":915,"line":1109},[913,3361,1135],{"class":970},[913,3363,3364],{"class":915,"line":1115},[913,3365,958],{"emptyLinePlaceholder":957},[913,3367,3368],{"class":915,"line":1120},[913,3369,3370],{"class":1146},"\u002F\u002F 发布者\n",[913,3372,3373,3375,3378,3380,3382,3384,3386,3388,3390,3392,3395,3397,3399,3401,3403,3405],{"class":915,"line":1132},[913,3374,964],{"class":941},[913,3376,3377],{"class":919}," PublishToExchange",[913,3379,971],{"class":970},[913,3381,2670],{"class":974},[913,3383,2673],{"class":941},[913,3385,2506],{"class":919},[913,3387,990],{"class":970},[913,3389,2522],{"class":919},[913,3391,996],{"class":970},[913,3393,3394],{"class":974},"exchange",[913,3396,996],{"class":970},[913,3398,2818],{"class":974},[913,3400,1185],{"class":941},[913,3402,1188],{"class":970},[913,3404,999],{"class":941},[913,3406,1095],{"class":970},[913,3408,3409,3411,3413,3415],{"class":915,"line":1138},[913,3410,1123],{"class":941},[913,3412,2708],{"class":970},[913,3414,2835],{"class":919},[913,3416,2714],{"class":970},[913,3418,3419,3421,3423],{"class":915,"line":1143},[913,3420,2842],{"class":970},[913,3422,2373],{"class":919},[913,3424,2847],{"class":970},[913,3426,3427,3430],{"class":915,"line":1150},[913,3428,3429],{"class":970},"        exchange, ",[913,3431,2858],{"class":1146},[913,3433,3434,3436,3439],{"class":915,"line":1195},[913,3435,2852],{"class":923},[913,3437,3438],{"class":970},",       ",[913,3440,3441],{"class":1146},"\u002F\u002F routing key（fanout 忽略）\n",[913,3443,3444,3446],{"class":915,"line":1216},[913,3445,2738],{"class":1043},[913,3447,1957],{"class":970},[913,3449,3450,3452],{"class":915,"line":1222},[913,3451,2738],{"class":1043},[913,3453,1957],{"class":970},[913,3455,3456,3458,3460,3462],{"class":915,"line":1234},[913,3457,2889],{"class":919},[913,3459,990],{"class":970},[913,3461,2894],{"class":919},[913,3463,1213],{"class":970},[913,3465,3466,3469,3471],{"class":915,"line":1245},[913,3467,3468],{"class":970},"            ContentType: ",[913,3470,2909],{"class":923},[913,3472,1957],{"class":970},[913,3474,3475,3478,3480],{"class":915,"line":1250},[913,3476,3477],{"class":970},"            Body:        []",[913,3479,2919],{"class":941},[913,3481,2922],{"class":970},[913,3483,3484],{"class":915,"line":1255},[913,3485,2927],{"class":970},[913,3487,3488],{"class":915,"line":1272},[913,3489,2777],{"class":970},[913,3491,3492],{"class":915,"line":1285},[913,3493,1135],{"class":970},[913,3495,3496],{"class":915,"line":1293},[913,3497,958],{"emptyLinePlaceholder":957},[913,3499,3500],{"class":915,"line":1298},[913,3501,3502],{"class":1146},"\u002F\u002F 订阅者\n",[913,3504,3505,3507,3510,3512,3514,3516,3518,3520,3522,3524,3526,3528],{"class":915,"line":1303},[913,3506,964],{"class":941},[913,3508,3509],{"class":919}," Subscribe",[913,3511,971],{"class":970},[913,3513,2670],{"class":974},[913,3515,2673],{"class":941},[913,3517,2506],{"class":919},[913,3519,990],{"class":970},[913,3521,2522],{"class":919},[913,3523,996],{"class":970},[913,3525,3394],{"class":974},[913,3527,1185],{"class":941},[913,3529,1002],{"class":970},[913,3531,3532],{"class":915,"line":1332},[913,3533,3534],{"class":1146},"    \u002F\u002F 声明临时队列\n",[913,3536,3537,3540,3542,3544,3546],{"class":915,"line":1340},[913,3538,3539],{"class":970},"    q, _ ",[913,3541,1011],{"class":941},[913,3543,2708],{"class":970},[913,3545,2711],{"class":919},[913,3547,2714],{"class":970},[913,3549,3550,3552,3554],{"class":915,"line":1682},[913,3551,2852],{"class":923},[913,3553,2855],{"class":970},[913,3555,3556],{"class":1146},"\u002F\u002F 随机队列名\n",[913,3558,3559,3561,3563],{"class":915,"line":2407},[913,3560,2738],{"class":1043},[913,3562,996],{"class":970},[913,3564,3565],{"class":1146},"\u002F\u002F 非持久化\n",[913,3567,3568,3570,3572],{"class":915,"line":2426},[913,3569,2727],{"class":1043},[913,3571,2730],{"class":970},[913,3573,2743],{"class":1146},[913,3575,3576,3578,3580],{"class":915,"line":2431},[913,3577,2727],{"class":1043},[913,3579,2730],{"class":970},[913,3581,2752],{"class":1146},[913,3583,3584,3586],{"class":915,"line":2436},[913,3585,2738],{"class":1043},[913,3587,1957],{"class":970},[913,3589,3590,3592],{"class":915,"line":3038},[913,3591,2766],{"class":1043},[913,3593,1957],{"class":970},[913,3595,3596],{"class":915,"line":3048},[913,3597,2777],{"class":970},[913,3599,3600],{"class":915,"line":3053},[913,3601,1061],{"class":970},[913,3603,3604],{"class":915,"line":3066},[913,3605,3606],{"class":1146},"    \u002F\u002F 绑定到 Exchange\n",[913,3608,3609,3612,3615,3618,3620,3623,3625,3627,3629],{"class":915,"line":3073},[913,3610,3611],{"class":970},"    ch.",[913,3613,3614],{"class":919},"QueueBind",[913,3616,3617],{"class":970},"(q.Name, ",[913,3619,2201],{"class":923},[913,3621,3622],{"class":970},", exchange, ",[913,3624,3148],{"class":1043},[913,3626,996],{"class":970},[913,3628,2567],{"class":1043},[913,3630,2204],{"class":970},[913,3632,3633],{"class":915,"line":3078},[913,3634,1061],{"class":970},[913,3636,3637],{"class":915,"line":3083},[913,3638,3639],{"class":1146},"    \u002F\u002F 消费\n",[913,3641,3642,3645,3647,3649,3651,3653,3655,3657,3660,3662,3664,3666,3668,3670,3672,3674,3676],{"class":915,"line":3097},[913,3643,3644],{"class":970},"    msgs, _ ",[913,3646,1011],{"class":941},[913,3648,2708],{"class":970},[913,3650,2395],{"class":919},[913,3652,3617],{"class":970},[913,3654,2201],{"class":923},[913,3656,996],{"class":970},[913,3658,3659],{"class":1043},"true",[913,3661,996],{"class":970},[913,3663,3148],{"class":1043},[913,3665,996],{"class":970},[913,3667,3148],{"class":1043},[913,3669,996],{"class":970},[913,3671,3148],{"class":1043},[913,3673,996],{"class":970},[913,3675,2567],{"class":1043},[913,3677,2204],{"class":970},[913,3679,3680],{"class":915,"line":3116},[913,3681,1061],{"class":970},[913,3683,3684,3686,3688,3690,3692],{"class":915,"line":3121},[913,3685,1907],{"class":941},[913,3687,1910],{"class":970},[913,3689,1011],{"class":941},[913,3691,1915],{"class":941},[913,3693,3094],{"class":970},[913,3695,3696,3698,3700,3702,3704,3706,3708],{"class":915,"line":3126},[913,3697,1927],{"class":970},[913,3699,1309],{"class":919},[913,3701,971],{"class":970},[913,3703,3106],{"class":923},[913,3705,1530],{"class":1043},[913,3707,1326],{"class":923},[913,3709,3113],{"class":970},[913,3711,3712],{"class":915,"line":3131},[913,3713,1112],{"class":970},[913,3715,3716],{"class":915,"line":3137},[913,3717,1135],{"class":970},[900,3719,3721],{"id":3720},"路由模式direct","路由模式（Direct）",[904,3723,3725],{"className":933,"code":3724,"language":920,"meta":11,"style":11},"\u002F\u002F 发布者\nfunc PublishWithRouting(ch *amqp.Channel, exchange, routingKey, message string) error {\n    return ch.PublishWithContext(\n        context.Background(),\n        exchange,\n        routingKey, \u002F\u002F 路由键\n        false,\n        false,\n        amqp.Publishing{\n            ContentType: \"text\u002Fplain\",\n            Body:        []byte(message),\n        },\n    )\n}\n\n\u002F\u002F 订阅者\nfunc SubscribeWithRouting(ch *amqp.Channel, exchange string, routingKeys []string) {\n    q, _ := ch.QueueDeclare(\"\", false, true, true, false, nil)\n    \n    \u002F\u002F 绑定多个路由键\n    for _, key := range routingKeys {\n        ch.QueueBind(q.Name, key, exchange, false, nil)\n    }\n    \n    msgs, _ := ch.Consume(q.Name, \"\", true, false, false, false, nil)\n    \n    for msg := range msgs {\n        fmt.Printf(\"[%s] %s\\n\", msg.RoutingKey, msg.Body)\n    }\n}\n\n\u002F\u002F 使用示例\n\u002F\u002F 发布者发送不同路由键的消息\nPublishWithRouting(ch, \"logs\", \"error\", \"Error message\")\nPublishWithRouting(ch, \"logs\", \"info\", \"Info message\")\nPublishWithRouting(ch, \"logs\", \"warning\", \"Warning message\")\n\n\u002F\u002F 订阅者只接收 error 和 warning\nSubscribeWithRouting(ch, \"logs\", []string{\"error\", \"warning\"})\n",[910,3726,3727,3731,3771,3781,3789,3794,3802,3808,3814,3824,3832,3840,3844,3848,3852,3856,3860,3896,3932,3936,3941,3955,3973,3977,3981,4017,4021,4033,4056,4060,4064,4068,4073,4078,4101,4121,4141,4145,4150],{"__ignoreMap":11},[913,3728,3729],{"class":915,"line":916},[913,3730,3370],{"class":1146},[913,3732,3733,3735,3738,3740,3742,3744,3746,3748,3750,3752,3754,3756,3759,3761,3763,3765,3767,3769],{"class":915,"line":954},[913,3734,964],{"class":941},[913,3736,3737],{"class":919}," PublishWithRouting",[913,3739,971],{"class":970},[913,3741,2670],{"class":974},[913,3743,2673],{"class":941},[913,3745,2506],{"class":919},[913,3747,990],{"class":970},[913,3749,2522],{"class":919},[913,3751,996],{"class":970},[913,3753,3394],{"class":974},[913,3755,996],{"class":970},[913,3757,3758],{"class":974},"routingKey",[913,3760,996],{"class":970},[913,3762,2818],{"class":974},[913,3764,1185],{"class":941},[913,3766,1188],{"class":970},[913,3768,999],{"class":941},[913,3770,1095],{"class":970},[913,3772,3773,3775,3777,3779],{"class":915,"line":961},[913,3774,1123],{"class":941},[913,3776,2708],{"class":970},[913,3778,2835],{"class":919},[913,3780,2714],{"class":970},[913,3782,3783,3785,3787],{"class":915,"line":1005},[913,3784,2842],{"class":970},[913,3786,2373],{"class":919},[913,3788,2847],{"class":970},[913,3790,3791],{"class":915,"line":1023},[913,3792,3793],{"class":970},"        exchange,\n",[913,3795,3796,3799],{"class":915,"line":1035},[913,3797,3798],{"class":970},"        routingKey, ",[913,3800,3801],{"class":1146},"\u002F\u002F 路由键\n",[913,3803,3804,3806],{"class":915,"line":1047},[913,3805,2738],{"class":1043},[913,3807,1957],{"class":970},[913,3809,3810,3812],{"class":915,"line":1058},[913,3811,2738],{"class":1043},[913,3813,1957],{"class":970},[913,3815,3816,3818,3820,3822],{"class":915,"line":1064},[913,3817,2889],{"class":919},[913,3819,990],{"class":970},[913,3821,2894],{"class":919},[913,3823,1213],{"class":970},[913,3825,3826,3828,3830],{"class":915,"line":1080},[913,3827,3468],{"class":970},[913,3829,2909],{"class":923},[913,3831,1957],{"class":970},[913,3833,3834,3836,3838],{"class":915,"line":1098},[913,3835,3477],{"class":970},[913,3837,2919],{"class":941},[913,3839,2922],{"class":970},[913,3841,3842],{"class":915,"line":1109},[913,3843,2927],{"class":970},[913,3845,3846],{"class":915,"line":1115},[913,3847,2777],{"class":970},[913,3849,3850],{"class":915,"line":1120},[913,3851,1135],{"class":970},[913,3853,3854],{"class":915,"line":1132},[913,3855,958],{"emptyLinePlaceholder":957},[913,3857,3858],{"class":915,"line":1138},[913,3859,3502],{"class":1146},[913,3861,3862,3864,3867,3869,3871,3873,3875,3877,3879,3881,3883,3885,3887,3890,3892,3894],{"class":915,"line":1143},[913,3863,964],{"class":941},[913,3865,3866],{"class":919}," SubscribeWithRouting",[913,3868,971],{"class":970},[913,3870,2670],{"class":974},[913,3872,2673],{"class":941},[913,3874,2506],{"class":919},[913,3876,990],{"class":970},[913,3878,2522],{"class":919},[913,3880,996],{"class":970},[913,3882,3394],{"class":974},[913,3884,1185],{"class":941},[913,3886,996],{"class":970},[913,3888,3889],{"class":974},"routingKeys",[913,3891,978],{"class":970},[913,3893,981],{"class":941},[913,3895,1002],{"class":970},[913,3897,3898,3900,3902,3904,3906,3908,3910,3912,3914,3916,3918,3920,3922,3924,3926,3928,3930],{"class":915,"line":1150},[913,3899,3539],{"class":970},[913,3901,1011],{"class":941},[913,3903,2708],{"class":970},[913,3905,2711],{"class":919},[913,3907,971],{"class":970},[913,3909,2201],{"class":923},[913,3911,996],{"class":970},[913,3913,3148],{"class":1043},[913,3915,996],{"class":970},[913,3917,3659],{"class":1043},[913,3919,996],{"class":970},[913,3921,3659],{"class":1043},[913,3923,996],{"class":970},[913,3925,3148],{"class":1043},[913,3927,996],{"class":970},[913,3929,2567],{"class":1043},[913,3931,2204],{"class":970},[913,3933,3934],{"class":915,"line":1195},[913,3935,1061],{"class":970},[913,3937,3938],{"class":915,"line":1216},[913,3939,3940],{"class":1146},"    \u002F\u002F 绑定多个路由键\n",[913,3942,3943,3945,3948,3950,3952],{"class":915,"line":1222},[913,3944,1907],{"class":941},[913,3946,3947],{"class":970}," _, key ",[913,3949,1011],{"class":941},[913,3951,1915],{"class":941},[913,3953,3954],{"class":970}," routingKeys {\n",[913,3956,3957,3960,3962,3965,3967,3969,3971],{"class":915,"line":1234},[913,3958,3959],{"class":970},"        ch.",[913,3961,3614],{"class":919},[913,3963,3964],{"class":970},"(q.Name, key, exchange, ",[913,3966,3148],{"class":1043},[913,3968,996],{"class":970},[913,3970,2567],{"class":1043},[913,3972,2204],{"class":970},[913,3974,3975],{"class":915,"line":1245},[913,3976,1112],{"class":970},[913,3978,3979],{"class":915,"line":1250},[913,3980,1061],{"class":970},[913,3982,3983,3985,3987,3989,3991,3993,3995,3997,3999,4001,4003,4005,4007,4009,4011,4013,4015],{"class":915,"line":1255},[913,3984,3644],{"class":970},[913,3986,1011],{"class":941},[913,3988,2708],{"class":970},[913,3990,2395],{"class":919},[913,3992,3617],{"class":970},[913,3994,2201],{"class":923},[913,3996,996],{"class":970},[913,3998,3659],{"class":1043},[913,4000,996],{"class":970},[913,4002,3148],{"class":1043},[913,4004,996],{"class":970},[913,4006,3148],{"class":1043},[913,4008,996],{"class":970},[913,4010,3148],{"class":1043},[913,4012,996],{"class":970},[913,4014,2567],{"class":1043},[913,4016,2204],{"class":970},[913,4018,4019],{"class":915,"line":1272},[913,4020,1061],{"class":970},[913,4022,4023,4025,4027,4029,4031],{"class":915,"line":1285},[913,4024,1907],{"class":941},[913,4026,1910],{"class":970},[913,4028,1011],{"class":941},[913,4030,1915],{"class":941},[913,4032,3094],{"class":970},[913,4034,4035,4037,4039,4041,4044,4046,4049,4051,4053],{"class":915,"line":1293},[913,4036,1927],{"class":970},[913,4038,1309],{"class":919},[913,4040,971],{"class":970},[913,4042,4043],{"class":923},"\"[",[913,4045,1947],{"class":1043},[913,4047,4048],{"class":923},"] ",[913,4050,1530],{"class":1043},[913,4052,1326],{"class":923},[913,4054,4055],{"class":970},", msg.RoutingKey, msg.Body)\n",[913,4057,4058],{"class":915,"line":1298},[913,4059,1112],{"class":970},[913,4061,4062],{"class":915,"line":1303},[913,4063,1135],{"class":970},[913,4065,4066],{"class":915,"line":1332},[913,4067,958],{"emptyLinePlaceholder":957},[913,4069,4070],{"class":915,"line":1340},[913,4071,4072],{"class":1146},"\u002F\u002F 使用示例\n",[913,4074,4075],{"class":915,"line":1682},[913,4076,4077],{"class":1146},"\u002F\u002F 发布者发送不同路由键的消息\n",[913,4079,4080,4083,4086,4089,4091,4094,4096,4099],{"class":915,"line":2407},[913,4081,4082],{"class":919},"PublishWithRouting",[913,4084,4085],{"class":970},"(ch, ",[913,4087,4088],{"class":923},"\"logs\"",[913,4090,996],{"class":970},[913,4092,4093],{"class":923},"\"error\"",[913,4095,996],{"class":970},[913,4097,4098],{"class":923},"\"Error message\"",[913,4100,2204],{"class":970},[913,4102,4103,4105,4107,4109,4111,4114,4116,4119],{"class":915,"line":2426},[913,4104,4082],{"class":919},[913,4106,4085],{"class":970},[913,4108,4088],{"class":923},[913,4110,996],{"class":970},[913,4112,4113],{"class":923},"\"info\"",[913,4115,996],{"class":970},[913,4117,4118],{"class":923},"\"Info message\"",[913,4120,2204],{"class":970},[913,4122,4123,4125,4127,4129,4131,4134,4136,4139],{"class":915,"line":2431},[913,4124,4082],{"class":919},[913,4126,4085],{"class":970},[913,4128,4088],{"class":923},[913,4130,996],{"class":970},[913,4132,4133],{"class":923},"\"warning\"",[913,4135,996],{"class":970},[913,4137,4138],{"class":923},"\"Warning message\"",[913,4140,2204],{"class":970},[913,4142,4143],{"class":915,"line":2436},[913,4144,958],{"emptyLinePlaceholder":957},[913,4146,4147],{"class":915,"line":3038},[913,4148,4149],{"class":1146},"\u002F\u002F 订阅者只接收 error 和 warning\n",[913,4151,4152,4155,4157,4159,4162,4164,4167,4169,4171,4173],{"class":915,"line":3048},[913,4153,4154],{"class":919},"SubscribeWithRouting",[913,4156,4085],{"class":970},[913,4158,4088],{"class":923},[913,4160,4161],{"class":970},", []",[913,4163,981],{"class":941},[913,4165,4166],{"class":970},"{",[913,4168,4093],{"class":923},[913,4170,996],{"class":970},[913,4172,4133],{"class":923},[913,4174,4175],{"class":970},"})\n",[900,4177,4179],{"id":4178},"主题模式topic","主题模式（Topic）",[904,4181,4183],{"className":933,"code":4182,"language":920,"meta":11,"style":11},"\u002F\u002F 路由键格式：word1.word2.word3\n\u002F\u002F * 匹配一个单词\n\u002F\u002F # 匹配零个或多个单词\n\n\u002F\u002F 发布者\nPublishWithRouting(ch, \"logs\", \"user.created\", \"User created\")\nPublishWithRouting(ch, \"logs\", \"user.deleted\", \"User deleted\")\nPublishWithRouting(ch, \"logs\", \"order.created\", \"Order created\")\n\n\u002F\u002F 订阅者\n\u002F\u002F 接收所有 user 相关消息\nSubscribeWithRouting(ch, \"logs\", []string{\"user.*\"})\n\n\u002F\u002F 接收所有 created 消息\nSubscribeWithRouting(ch, \"logs\", []string{\"*.created\"})\n\n\u002F\u002F 接收所有消息\nSubscribeWithRouting(ch, \"logs\", []string{\"#\"})\n",[910,4184,4185,4190,4195,4200,4204,4208,4228,4248,4268,4272,4276,4281,4300,4304,4309,4328,4332,4337],{"__ignoreMap":11},[913,4186,4187],{"class":915,"line":916},[913,4188,4189],{"class":1146},"\u002F\u002F 路由键格式：word1.word2.word3\n",[913,4191,4192],{"class":915,"line":954},[913,4193,4194],{"class":1146},"\u002F\u002F * 匹配一个单词\n",[913,4196,4197],{"class":915,"line":961},[913,4198,4199],{"class":1146},"\u002F\u002F # 匹配零个或多个单词\n",[913,4201,4202],{"class":915,"line":1005},[913,4203,958],{"emptyLinePlaceholder":957},[913,4205,4206],{"class":915,"line":1023},[913,4207,3370],{"class":1146},[913,4209,4210,4212,4214,4216,4218,4221,4223,4226],{"class":915,"line":1035},[913,4211,4082],{"class":919},[913,4213,4085],{"class":970},[913,4215,4088],{"class":923},[913,4217,996],{"class":970},[913,4219,4220],{"class":923},"\"user.created\"",[913,4222,996],{"class":970},[913,4224,4225],{"class":923},"\"User created\"",[913,4227,2204],{"class":970},[913,4229,4230,4232,4234,4236,4238,4241,4243,4246],{"class":915,"line":1047},[913,4231,4082],{"class":919},[913,4233,4085],{"class":970},[913,4235,4088],{"class":923},[913,4237,996],{"class":970},[913,4239,4240],{"class":923},"\"user.deleted\"",[913,4242,996],{"class":970},[913,4244,4245],{"class":923},"\"User deleted\"",[913,4247,2204],{"class":970},[913,4249,4250,4252,4254,4256,4258,4261,4263,4266],{"class":915,"line":1058},[913,4251,4082],{"class":919},[913,4253,4085],{"class":970},[913,4255,4088],{"class":923},[913,4257,996],{"class":970},[913,4259,4260],{"class":923},"\"order.created\"",[913,4262,996],{"class":970},[913,4264,4265],{"class":923},"\"Order created\"",[913,4267,2204],{"class":970},[913,4269,4270],{"class":915,"line":1064},[913,4271,958],{"emptyLinePlaceholder":957},[913,4273,4274],{"class":915,"line":1080},[913,4275,3502],{"class":1146},[913,4277,4278],{"class":915,"line":1098},[913,4279,4280],{"class":1146},"\u002F\u002F 接收所有 user 相关消息\n",[913,4282,4283,4285,4287,4289,4291,4293,4295,4298],{"class":915,"line":1109},[913,4284,4154],{"class":919},[913,4286,4085],{"class":970},[913,4288,4088],{"class":923},[913,4290,4161],{"class":970},[913,4292,981],{"class":941},[913,4294,4166],{"class":970},[913,4296,4297],{"class":923},"\"user.*\"",[913,4299,4175],{"class":970},[913,4301,4302],{"class":915,"line":1115},[913,4303,958],{"emptyLinePlaceholder":957},[913,4305,4306],{"class":915,"line":1120},[913,4307,4308],{"class":1146},"\u002F\u002F 接收所有 created 消息\n",[913,4310,4311,4313,4315,4317,4319,4321,4323,4326],{"class":915,"line":1132},[913,4312,4154],{"class":919},[913,4314,4085],{"class":970},[913,4316,4088],{"class":923},[913,4318,4161],{"class":970},[913,4320,981],{"class":941},[913,4322,4166],{"class":970},[913,4324,4325],{"class":923},"\"*.created\"",[913,4327,4175],{"class":970},[913,4329,4330],{"class":915,"line":1138},[913,4331,958],{"emptyLinePlaceholder":957},[913,4333,4334],{"class":915,"line":1143},[913,4335,4336],{"class":1146},"\u002F\u002F 接收所有消息\n",[913,4338,4339,4341,4343,4345,4347,4349,4351,4354],{"class":915,"line":1150},[913,4340,4154],{"class":919},[913,4342,4085],{"class":970},[913,4344,4088],{"class":923},[913,4346,4161],{"class":970},[913,4348,981],{"class":941},[913,4350,4166],{"class":970},[913,4352,4353],{"class":923},"\"#\"",[913,4355,4175],{"class":970},[895,4357,4358],{"id":4358},"消息模式",[900,4360,4362],{"id":4361},"请求响应","请求\u002F响应",[904,4364,4366],{"className":933,"code":4365,"language":920,"meta":11,"style":11},"\u002F\u002F RPC 客户端\nfunc RPCClient(ch *amqp.Channel, message string) string {\n    \u002F\u002F 声明回调队列\n    replyQueue, _ := ch.QueueDeclare(\"\", false, true, true, false, nil)\n    \n    corrID := uuid.New().String()\n    \n    \u002F\u002F 发送请求\n    ch.PublishWithContext(\n        context.Background(),\n        \"\",\n        \"rpc_queue\",\n        false,\n        false,\n        amqp.Publishing{\n            ContentType:   \"text\u002Fplain\",\n            CorrelationId: corrID,\n            ReplyTo:       replyQueue.Name,\n            Body:          []byte(message),\n        },\n    )\n    \n    \u002F\u002F 等待响应\n    msgs, _ := ch.Consume(replyQueue.Name, \"\", true, false, false, false, nil)\n    \n    for msg := range msgs {\n        if msg.CorrelationId == corrID {\n            return string(msg.Body)\n        }\n    }\n    \n    return \"\"\n}\n\n\u002F\u002F RPC 服务端\nfunc RPCServer(ch *amqp.Channel) {\n    msgs, _ := ch.Consume(\"rpc_queue\", \"\", false, false, false, false, nil)\n    \n    for msg := range msgs {\n        \u002F\u002F 处理请求\n        result := process(string(msg.Body))\n        \n        \u002F\u002F 发送响应\n        ch.PublishWithContext(\n            context.Background(),\n            \"\",\n            msg.ReplyTo,\n            false,\n            false,\n            amqp.Publishing{\n                ContentType:   \"text\u002Fplain\",\n                CorrelationId: msg.CorrelationId,\n                Body:          []byte(result),\n            },\n        )\n        \n        msg.Ack(false)\n    }\n}\n",[910,4367,4368,4373,4404,4409,4446,4450,4471,4475,4480,4488,4496,4502,4509,4515,4521,4531,4540,4545,4550,4559,4563,4567,4571,4576,4613,4617,4629,4642,4652,4656,4660,4664,4671,4675,4679,4684,4705,4746,4750,4762,4767,4784,4788,4793,4801,4810,4817,4822,4829,4835,4846,4855,4860,4871,4877,4883,4888,4901,4906],{"__ignoreMap":11},[913,4369,4370],{"class":915,"line":916},[913,4371,4372],{"class":1146},"\u002F\u002F RPC 客户端\n",[913,4374,4375,4377,4380,4382,4384,4386,4388,4390,4392,4394,4396,4398,4400,4402],{"class":915,"line":954},[913,4376,964],{"class":941},[913,4378,4379],{"class":919}," RPCClient",[913,4381,971],{"class":970},[913,4383,2670],{"class":974},[913,4385,2673],{"class":941},[913,4387,2506],{"class":919},[913,4389,990],{"class":970},[913,4391,2522],{"class":919},[913,4393,996],{"class":970},[913,4395,2818],{"class":974},[913,4397,1185],{"class":941},[913,4399,1188],{"class":970},[913,4401,981],{"class":941},[913,4403,1095],{"class":970},[913,4405,4406],{"class":915,"line":961},[913,4407,4408],{"class":1146},"    \u002F\u002F 声明回调队列\n",[913,4410,4411,4414,4416,4418,4420,4422,4424,4426,4428,4430,4432,4434,4436,4438,4440,4442,4444],{"class":915,"line":1005},[913,4412,4413],{"class":970},"    replyQueue, _ ",[913,4415,1011],{"class":941},[913,4417,2708],{"class":970},[913,4419,2711],{"class":919},[913,4421,971],{"class":970},[913,4423,2201],{"class":923},[913,4425,996],{"class":970},[913,4427,3148],{"class":1043},[913,4429,996],{"class":970},[913,4431,3659],{"class":1043},[913,4433,996],{"class":970},[913,4435,3659],{"class":1043},[913,4437,996],{"class":970},[913,4439,3148],{"class":1043},[913,4441,996],{"class":970},[913,4443,2567],{"class":1043},[913,4445,2204],{"class":970},[913,4447,4448],{"class":915,"line":1023},[913,4449,1061],{"class":970},[913,4451,4452,4455,4457,4460,4463,4466,4469],{"class":915,"line":1035},[913,4453,4454],{"class":970},"    corrID ",[913,4456,1011],{"class":941},[913,4458,4459],{"class":970}," uuid.",[913,4461,4462],{"class":919},"New",[913,4464,4465],{"class":970},"().",[913,4467,4468],{"class":919},"String",[913,4470,1020],{"class":970},[913,4472,4473],{"class":915,"line":1047},[913,4474,1061],{"class":970},[913,4476,4477],{"class":915,"line":1058},[913,4478,4479],{"class":1146},"    \u002F\u002F 发送请求\n",[913,4481,4482,4484,4486],{"class":915,"line":1064},[913,4483,3611],{"class":970},[913,4485,2835],{"class":919},[913,4487,2714],{"class":970},[913,4489,4490,4492,4494],{"class":915,"line":1080},[913,4491,2842],{"class":970},[913,4493,2373],{"class":919},[913,4495,2847],{"class":970},[913,4497,4498,4500],{"class":915,"line":1098},[913,4499,2852],{"class":923},[913,4501,1957],{"class":970},[913,4503,4504,4507],{"class":915,"line":1109},[913,4505,4506],{"class":923},"        \"rpc_queue\"",[913,4508,1957],{"class":970},[913,4510,4511,4513],{"class":915,"line":1115},[913,4512,2738],{"class":1043},[913,4514,1957],{"class":970},[913,4516,4517,4519],{"class":915,"line":1120},[913,4518,2738],{"class":1043},[913,4520,1957],{"class":970},[913,4522,4523,4525,4527,4529],{"class":915,"line":1132},[913,4524,2889],{"class":919},[913,4526,990],{"class":970},[913,4528,2894],{"class":919},[913,4530,1213],{"class":970},[913,4532,4533,4536,4538],{"class":915,"line":1138},[913,4534,4535],{"class":970},"            ContentType:   ",[913,4537,2909],{"class":923},[913,4539,1957],{"class":970},[913,4541,4542],{"class":915,"line":1143},[913,4543,4544],{"class":970},"            CorrelationId: corrID,\n",[913,4546,4547],{"class":915,"line":1150},[913,4548,4549],{"class":970},"            ReplyTo:       replyQueue.Name,\n",[913,4551,4552,4555,4557],{"class":915,"line":1195},[913,4553,4554],{"class":970},"            Body:          []",[913,4556,2919],{"class":941},[913,4558,2922],{"class":970},[913,4560,4561],{"class":915,"line":1216},[913,4562,2927],{"class":970},[913,4564,4565],{"class":915,"line":1222},[913,4566,2777],{"class":970},[913,4568,4569],{"class":915,"line":1234},[913,4570,1061],{"class":970},[913,4572,4573],{"class":915,"line":1245},[913,4574,4575],{"class":1146},"    \u002F\u002F 等待响应\n",[913,4577,4578,4580,4582,4584,4586,4589,4591,4593,4595,4597,4599,4601,4603,4605,4607,4609,4611],{"class":915,"line":1250},[913,4579,3644],{"class":970},[913,4581,1011],{"class":941},[913,4583,2708],{"class":970},[913,4585,2395],{"class":919},[913,4587,4588],{"class":970},"(replyQueue.Name, ",[913,4590,2201],{"class":923},[913,4592,996],{"class":970},[913,4594,3659],{"class":1043},[913,4596,996],{"class":970},[913,4598,3148],{"class":1043},[913,4600,996],{"class":970},[913,4602,3148],{"class":1043},[913,4604,996],{"class":970},[913,4606,3148],{"class":1043},[913,4608,996],{"class":970},[913,4610,2567],{"class":1043},[913,4612,2204],{"class":970},[913,4614,4615],{"class":915,"line":1255},[913,4616,1061],{"class":970},[913,4618,4619,4621,4623,4625,4627],{"class":915,"line":1272},[913,4620,1907],{"class":941},[913,4622,1910],{"class":970},[913,4624,1011],{"class":941},[913,4626,1915],{"class":941},[913,4628,3094],{"class":970},[913,4630,4631,4633,4636,4639],{"class":915,"line":1285},[913,4632,2386],{"class":941},[913,4634,4635],{"class":970}," msg.CorrelationId ",[913,4637,4638],{"class":941},"==",[913,4640,4641],{"class":970}," corrID {\n",[913,4643,4644,4647,4649],{"class":915,"line":1293},[913,4645,4646],{"class":941},"            return",[913,4648,1185],{"class":941},[913,4650,4651],{"class":970},"(msg.Body)\n",[913,4653,4654],{"class":915,"line":1298},[913,4655,1581],{"class":970},[913,4657,4658],{"class":915,"line":1303},[913,4659,1112],{"class":970},[913,4661,4662],{"class":915,"line":1332},[913,4663,1061],{"class":970},[913,4665,4666,4668],{"class":915,"line":1340},[913,4667,1123],{"class":941},[913,4669,4670],{"class":923}," \"\"\n",[913,4672,4673],{"class":915,"line":1682},[913,4674,1135],{"class":970},[913,4676,4677],{"class":915,"line":2407},[913,4678,958],{"emptyLinePlaceholder":957},[913,4680,4681],{"class":915,"line":2426},[913,4682,4683],{"class":1146},"\u002F\u002F RPC 服务端\n",[913,4685,4686,4688,4691,4693,4695,4697,4699,4701,4703],{"class":915,"line":2431},[913,4687,964],{"class":941},[913,4689,4690],{"class":919}," RPCServer",[913,4692,971],{"class":970},[913,4694,2670],{"class":974},[913,4696,2673],{"class":941},[913,4698,2506],{"class":919},[913,4700,990],{"class":970},[913,4702,2522],{"class":919},[913,4704,1002],{"class":970},[913,4706,4707,4709,4711,4713,4715,4717,4720,4722,4724,4726,4728,4730,4732,4734,4736,4738,4740,4742,4744],{"class":915,"line":2436},[913,4708,3644],{"class":970},[913,4710,1011],{"class":941},[913,4712,2708],{"class":970},[913,4714,2395],{"class":919},[913,4716,971],{"class":970},[913,4718,4719],{"class":923},"\"rpc_queue\"",[913,4721,996],{"class":970},[913,4723,2201],{"class":923},[913,4725,996],{"class":970},[913,4727,3148],{"class":1043},[913,4729,996],{"class":970},[913,4731,3148],{"class":1043},[913,4733,996],{"class":970},[913,4735,3148],{"class":1043},[913,4737,996],{"class":970},[913,4739,3148],{"class":1043},[913,4741,996],{"class":970},[913,4743,2567],{"class":1043},[913,4745,2204],{"class":970},[913,4747,4748],{"class":915,"line":3038},[913,4749,1061],{"class":970},[913,4751,4752,4754,4756,4758,4760],{"class":915,"line":3048},[913,4753,1907],{"class":941},[913,4755,1910],{"class":970},[913,4757,1011],{"class":941},[913,4759,1915],{"class":941},[913,4761,3094],{"class":970},[913,4763,4764],{"class":915,"line":3053},[913,4765,4766],{"class":1146},"        \u002F\u002F 处理请求\n",[913,4768,4769,4772,4774,4777,4779,4781],{"class":915,"line":3066},[913,4770,4771],{"class":970},"        result ",[913,4773,1011],{"class":941},[913,4775,4776],{"class":919}," process",[913,4778,971],{"class":970},[913,4780,981],{"class":941},[913,4782,4783],{"class":970},"(msg.Body))\n",[913,4785,4786],{"class":915,"line":3073},[913,4787,2173],{"class":970},[913,4789,4790],{"class":915,"line":3078},[913,4791,4792],{"class":1146},"        \u002F\u002F 发送响应\n",[913,4794,4795,4797,4799],{"class":915,"line":3083},[913,4796,3959],{"class":970},[913,4798,2835],{"class":919},[913,4800,2714],{"class":970},[913,4802,4803,4806,4808],{"class":915,"line":3097},[913,4804,4805],{"class":970},"            context.",[913,4807,2373],{"class":919},[913,4809,2847],{"class":970},[913,4811,4812,4815],{"class":915,"line":3116},[913,4813,4814],{"class":923},"            \"\"",[913,4816,1957],{"class":970},[913,4818,4819],{"class":915,"line":3121},[913,4820,4821],{"class":970},"            msg.ReplyTo,\n",[913,4823,4824,4827],{"class":915,"line":3126},[913,4825,4826],{"class":1043},"            false",[913,4828,1957],{"class":970},[913,4830,4831,4833],{"class":915,"line":3131},[913,4832,4826],{"class":1043},[913,4834,1957],{"class":970},[913,4836,4837,4840,4842,4844],{"class":915,"line":3137},[913,4838,4839],{"class":919},"            amqp",[913,4841,990],{"class":970},[913,4843,2894],{"class":919},[913,4845,1213],{"class":970},[913,4847,4848,4851,4853],{"class":915,"line":3153},[913,4849,4850],{"class":970},"                ContentType:   ",[913,4852,2909],{"class":923},[913,4854,1957],{"class":970},[913,4856,4857],{"class":915,"line":3158},[913,4858,4859],{"class":970},"                CorrelationId: msg.CorrelationId,\n",[913,4861,4863,4866,4868],{"class":915,"line":4862},53,[913,4864,4865],{"class":970},"                Body:          []",[913,4867,2919],{"class":941},[913,4869,4870],{"class":970},"(result),\n",[913,4872,4874],{"class":915,"line":4873},54,[913,4875,4876],{"class":970},"            },\n",[913,4878,4880],{"class":915,"line":4879},55,[913,4881,4882],{"class":970},"        )\n",[913,4884,4886],{"class":915,"line":4885},56,[913,4887,2173],{"class":970},[913,4889,4891,4893,4895,4897,4899],{"class":915,"line":4890},57,[913,4892,3140],{"class":970},[913,4894,3143],{"class":919},[913,4896,971],{"class":970},[913,4898,3148],{"class":1043},[913,4900,2204],{"class":970},[913,4902,4904],{"class":915,"line":4903},58,[913,4905,1112],{"class":970},[913,4907,4909],{"class":915,"line":4908},59,[913,4910,1135],{"class":970},[900,4912,4914],{"id":4913},"延迟队列死信队列","延迟队列（死信队列）",[904,4916,4918],{"className":933,"code":4917,"language":920,"meta":11,"style":11},"\u002F\u002F 声明死信交换机和队列\nch.ExchangeDeclare(\"dlx\", \"direct\", true, false, false, false, nil)\nch.QueueDeclare(\"dlq\", true, false, false, false, nil)\nch.QueueBind(\"dlq\", \"delay\", \"dlx\", false, nil)\n\n\u002F\u002F 声明延迟队列\nch.QueueDeclare(\n    \"delay_queue\",\n    true,\n    false,\n    false,\n    false,\n    amqp.Table{\n        \"x-dead-letter-exchange\":    \"dlx\",\n        \"x-dead-letter-routing-key\": \"delay\",\n        \"x-message-ttl\":             30000, \u002F\u002F 30 秒后过期\n    },\n)\n\n\u002F\u002F 发送延迟消息\nch.PublishWithContext(\n    context.Background(),\n    \"\",\n    \"delay_queue\",\n    false,\n    false,\n    amqp.Publishing{\n        ContentType: \"text\u002Fplain\",\n        Body:        []byte(\"delayed message\"),\n    },\n)\n\n\u002F\u002F 消费延迟消息（从死信队列）\nmsgs, _ := ch.Consume(\"dlq\", \"\", true, false, false, false, nil)\n",[910,4919,4920,4925,4963,4996,5025,5029,5034,5042,5049,5056,5062,5068,5074,5086,5098,5110,5126,5131,5135,5139,5144,5152,5161,5168,5174,5180,5186,5196,5205,5220,5224,5228,5232,5237],{"__ignoreMap":11},[913,4921,4922],{"class":915,"line":916},[913,4923,4924],{"class":1146},"\u002F\u002F 声明死信交换机和队列\n",[913,4926,4927,4929,4931,4933,4936,4938,4941,4943,4945,4947,4949,4951,4953,4955,4957,4959,4961],{"class":915,"line":954},[913,4928,3179],{"class":970},[913,4930,3292],{"class":919},[913,4932,971],{"class":970},[913,4934,4935],{"class":923},"\"dlx\"",[913,4937,996],{"class":970},[913,4939,4940],{"class":923},"\"direct\"",[913,4942,996],{"class":970},[913,4944,3659],{"class":1043},[913,4946,996],{"class":970},[913,4948,3148],{"class":1043},[913,4950,996],{"class":970},[913,4952,3148],{"class":1043},[913,4954,996],{"class":970},[913,4956,3148],{"class":1043},[913,4958,996],{"class":970},[913,4960,2567],{"class":1043},[913,4962,2204],{"class":970},[913,4964,4965,4967,4969,4971,4974,4976,4978,4980,4982,4984,4986,4988,4990,4992,4994],{"class":915,"line":961},[913,4966,3179],{"class":970},[913,4968,2711],{"class":919},[913,4970,971],{"class":970},[913,4972,4973],{"class":923},"\"dlq\"",[913,4975,996],{"class":970},[913,4977,3659],{"class":1043},[913,4979,996],{"class":970},[913,4981,3148],{"class":1043},[913,4983,996],{"class":970},[913,4985,3148],{"class":1043},[913,4987,996],{"class":970},[913,4989,3148],{"class":1043},[913,4991,996],{"class":970},[913,4993,2567],{"class":1043},[913,4995,2204],{"class":970},[913,4997,4998,5000,5002,5004,5006,5008,5011,5013,5015,5017,5019,5021,5023],{"class":915,"line":1005},[913,4999,3179],{"class":970},[913,5001,3614],{"class":919},[913,5003,971],{"class":970},[913,5005,4973],{"class":923},[913,5007,996],{"class":970},[913,5009,5010],{"class":923},"\"delay\"",[913,5012,996],{"class":970},[913,5014,4935],{"class":923},[913,5016,996],{"class":970},[913,5018,3148],{"class":1043},[913,5020,996],{"class":970},[913,5022,2567],{"class":1043},[913,5024,2204],{"class":970},[913,5026,5027],{"class":915,"line":1023},[913,5028,958],{"emptyLinePlaceholder":957},[913,5030,5031],{"class":915,"line":1035},[913,5032,5033],{"class":1146},"\u002F\u002F 声明延迟队列\n",[913,5035,5036,5038,5040],{"class":915,"line":1047},[913,5037,3179],{"class":970},[913,5039,2711],{"class":919},[913,5041,2714],{"class":970},[913,5043,5044,5047],{"class":915,"line":1058},[913,5045,5046],{"class":923},"    \"delay_queue\"",[913,5048,1957],{"class":970},[913,5050,5051,5054],{"class":915,"line":1064},[913,5052,5053],{"class":1043},"    true",[913,5055,1957],{"class":970},[913,5057,5058,5060],{"class":915,"line":1080},[913,5059,3210],{"class":1043},[913,5061,1957],{"class":970},[913,5063,5064,5066],{"class":915,"line":1098},[913,5065,3210],{"class":1043},[913,5067,1957],{"class":970},[913,5069,5070,5072],{"class":915,"line":1109},[913,5071,3210],{"class":1043},[913,5073,1957],{"class":970},[913,5075,5076,5079,5081,5084],{"class":915,"line":1115},[913,5077,5078],{"class":919},"    amqp",[913,5080,990],{"class":970},[913,5082,5083],{"class":919},"Table",[913,5085,1213],{"class":970},[913,5087,5088,5091,5094,5096],{"class":915,"line":1120},[913,5089,5090],{"class":923},"        \"x-dead-letter-exchange\"",[913,5092,5093],{"class":970},":    ",[913,5095,4935],{"class":923},[913,5097,1957],{"class":970},[913,5099,5100,5103,5106,5108],{"class":915,"line":1132},[913,5101,5102],{"class":923},"        \"x-dead-letter-routing-key\"",[913,5104,5105],{"class":970},": ",[913,5107,5010],{"class":923},[913,5109,1957],{"class":970},[913,5111,5112,5115,5118,5121,5123],{"class":915,"line":1138},[913,5113,5114],{"class":923},"        \"x-message-ttl\"",[913,5116,5117],{"class":970},":             ",[913,5119,5120],{"class":1043},"30000",[913,5122,996],{"class":970},[913,5124,5125],{"class":1146},"\u002F\u002F 30 秒后过期\n",[913,5127,5128],{"class":915,"line":1143},[913,5129,5130],{"class":970},"    },\n",[913,5132,5133],{"class":915,"line":1150},[913,5134,2204],{"class":970},[913,5136,5137],{"class":915,"line":1195},[913,5138,958],{"emptyLinePlaceholder":957},[913,5140,5141],{"class":915,"line":1216},[913,5142,5143],{"class":1146},"\u002F\u002F 发送延迟消息\n",[913,5145,5146,5148,5150],{"class":915,"line":1222},[913,5147,3179],{"class":970},[913,5149,2835],{"class":919},[913,5151,2714],{"class":970},[913,5153,5154,5157,5159],{"class":915,"line":1234},[913,5155,5156],{"class":970},"    context.",[913,5158,2373],{"class":919},[913,5160,2847],{"class":970},[913,5162,5163,5166],{"class":915,"line":1245},[913,5164,5165],{"class":923},"    \"\"",[913,5167,1957],{"class":970},[913,5169,5170,5172],{"class":915,"line":1250},[913,5171,5046],{"class":923},[913,5173,1957],{"class":970},[913,5175,5176,5178],{"class":915,"line":1255},[913,5177,3210],{"class":1043},[913,5179,1957],{"class":970},[913,5181,5182,5184],{"class":915,"line":1272},[913,5183,3210],{"class":1043},[913,5185,1957],{"class":970},[913,5187,5188,5190,5192,5194],{"class":915,"line":1285},[913,5189,5078],{"class":919},[913,5191,990],{"class":970},[913,5193,2894],{"class":919},[913,5195,1213],{"class":970},[913,5197,5198,5201,5203],{"class":915,"line":1293},[913,5199,5200],{"class":970},"        ContentType: ",[913,5202,2909],{"class":923},[913,5204,1957],{"class":970},[913,5206,5207,5210,5212,5214,5217],{"class":915,"line":1298},[913,5208,5209],{"class":970},"        Body:        []",[913,5211,2919],{"class":941},[913,5213,971],{"class":970},[913,5215,5216],{"class":923},"\"delayed message\"",[913,5218,5219],{"class":970},"),\n",[913,5221,5222],{"class":915,"line":1303},[913,5223,5130],{"class":970},[913,5225,5226],{"class":915,"line":1332},[913,5227,2204],{"class":970},[913,5229,5230],{"class":915,"line":1340},[913,5231,958],{"emptyLinePlaceholder":957},[913,5233,5234],{"class":915,"line":1682},[913,5235,5236],{"class":1146},"\u002F\u002F 消费延迟消息（从死信队列）\n",[913,5238,5239,5242,5244,5246,5248,5250,5252,5254,5256,5258,5260,5262,5264,5266,5268,5270,5272,5274,5276],{"class":915,"line":2407},[913,5240,5241],{"class":970},"msgs, _ ",[913,5243,1011],{"class":941},[913,5245,2708],{"class":970},[913,5247,2395],{"class":919},[913,5249,971],{"class":970},[913,5251,4973],{"class":923},[913,5253,996],{"class":970},[913,5255,2201],{"class":923},[913,5257,996],{"class":970},[913,5259,3659],{"class":1043},[913,5261,996],{"class":970},[913,5263,3148],{"class":1043},[913,5265,996],{"class":970},[913,5267,3148],{"class":1043},[913,5269,996],{"class":970},[913,5271,3148],{"class":1043},[913,5273,996],{"class":970},[913,5275,2567],{"class":1043},[913,5277,2204],{"class":970},[5279,5280,5281],"style",{},"html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":11,"searchDepth":954,"depth":954,"links":5283},[5284,5291,5300],{"id":897,"depth":954,"text":898,"children":5285},[5286,5287,5288,5289,5290],{"id":902,"depth":961,"text":902},{"id":930,"depth":961,"text":930},{"id":1345,"depth":961,"text":1345},{"id":1687,"depth":961,"text":1687},{"id":1973,"depth":961,"text":1973},{"id":2441,"depth":954,"text":2442,"children":5292},[5293,5294,5295,5296,5297,5298,5299],{"id":2445,"depth":961,"text":902},{"id":2462,"depth":961,"text":2462},{"id":2648,"depth":961,"text":2648},{"id":3163,"depth":961,"text":3164},{"id":3236,"depth":961,"text":3237},{"id":3720,"depth":961,"text":3721},{"id":4178,"depth":961,"text":4179},{"id":4358,"depth":954,"text":4358,"children":5301},[5302,5303],{"id":4361,"depth":961,"text":4362},{"id":4913,"depth":961,"text":4914},"md",{},{"title":192,"description":193},"golang\u002Fdistributed\u002Fmq","xmbsiOgwbGPC895gmWQ-tBBsTWaIOyj0EY0TPDX5NxE",1775496424404]