当前位置: 首页 > article >正文

Go语言的消息队列应用

Go语言的消息队列应用1. 消息队列简介消息队列是一种在分布式系统中用于异步通信的组件它允许不同的服务之间通过消息进行通信而不需要直接相互调用。消息队列可以解耦系统组件提高系统的可靠性、可扩展性和弹性。消息队列的优势解耦服务之间不需要直接依赖通过消息队列进行通信异步处理发送者不需要等待接收者处理完成削峰填谷处理突发流量保护系统免受流量冲击可靠投递确保消息不会丢失支持重试机制扩展性可以轻松添加新的消费者或生产者常见的消息队列系统RabbitMQ基于AMQP协议支持多种消息模式可靠性高Kafka高吞吐量适合处理大量数据支持持久化NATS轻量级低延迟适合实时应用Redis简单的消息队列功能适合轻量级场景RocketMQ阿里巴巴开源高可靠性适合金融场景2. RabbitMQ在Go中的应用RabbitMQ是一个功能强大的消息队列系统基于AMQP高级消息队列协议支持多种消息模式如点对点、发布/订阅、工作队列等。安装和配置# 安装RabbitMQ docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management # 安装Go客户端 go get github.com/streadway/amqp基本概念交换机Exchange接收消息并将其路由到队列队列Queue存储消息的地方绑定Binding将交换机和队列连接起来路由键Routing Key用于消息路由的键示例代码生产者package main import ( fmt log github.com/streadway/amqp ) func main() { // 连接到RabbitMQ服务器 conn, err : amqp.Dial(amqp://guest:guestlocalhost:5672/) if err ! nil { log.Fatalf(Failed to connect to RabbitMQ: %v, err) } defer conn.Close() // 创建通道 ch, err : conn.Channel() if err ! nil { log.Fatalf(Failed to open a channel: %v, err) } defer ch.Close() // 声明交换机 err ch.ExchangeDeclare( logs, // 交换机名称 fanout, // 交换机类型 true, // 持久化 false, // 自动删除 false, // 内部 false, // 不等待 nil, // 额外参数 ) if err ! nil { log.Fatalf(Failed to declare an exchange: %v, err) } // 发送消息 message : Hello, RabbitMQ! err ch.Publish( logs, // 交换机 , // 路由键 false, // 强制 false, // 立即 amqp.Publishing{ ContentType: text/plain, Body: []byte(message), }, ) if err ! nil { log.Fatalf(Failed to publish a message: %v, err) } fmt.Printf( [x] Sent %s\n, message) }消费者package main import ( fmt log github.com/streadway/amqp ) func main() { // 连接到RabbitMQ服务器 conn, err : amqp.Dial(amqp://guest:guestlocalhost:5672/) if err ! nil { log.Fatalf(Failed to connect to RabbitMQ: %v, err) } defer conn.Close() // 创建通道 ch, err : conn.Channel() if err ! nil { log.Fatalf(Failed to open a channel: %v, err) } defer ch.Close() // 声明交换机 err ch.ExchangeDeclare( logs, // 交换机名称 fanout, // 交换机类型 true, // 持久化 false, // 自动删除 false, // 内部 false, // 不等待 nil, // 额外参数 ) if err ! nil { log.Fatalf(Failed to declare an exchange: %v, err) } // 声明队列 q, err : ch.QueueDeclare( , // 队列名称自动生成 false, // 持久化 true, // 自动删除 true, // 排他性 false, // 不等待 nil, // 额外参数 ) if err ! nil { log.Fatalf(Failed to declare a queue: %v, err) } // 绑定队列到交换机 err ch.QueueBind( q.Name, // 队列名称 , // 路由键 logs, // 交换机名称 false, // 不等待 nil, // 额外参数 ) if err ! nil { log.Fatalf(Failed to bind a queue: %v, err) } // 消费消息 msgs, err : ch.Consume( q.Name, // 队列名称 , // 消费者标签 true, // 自动确认 false, // 排他性 false, // 不本地 false, // 不等待 nil, // 额外参数 ) if err ! nil { log.Fatalf(Failed to register a consumer: %v, err) } // 处理消息 forever : make(chan bool) go func() { for d : range msgs { fmt.Printf( [x] Received %s\n, d.Body) } }() fmt.Println( [*] Waiting for messages. To exit press CTRLC) -forever }3. Kafka在Go中的应用Kafka是一个高吞吐量的分布式消息队列系统适合处理大量数据支持持久化和水平扩展。安装和配置# 安装Kafka docker run -d --name kafka -p 9092:9092 -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://localhost:9092 -e KAFKA_ZOOKEEPER_CONNECTzookeeper:2181 confluentinc/cp-kafka:latest # 安装Go客户端 go get github.com/segmentio/kafka-go基本概念主题Topic消息的分类分区Partition主题的分片提高并发处理能力消费者组Consumer Group多个消费者组成的组共同消费主题偏移量Offset消息在分区中的位置示例代码生产者package main import ( context fmt log time github.com/segmentio/kafka-go ) func main() { // 创建生产者 w : kafka.NewWriter(kafka.WriterConfig{ Brokers: []string{localhost:9092}, Topic: test-topic, Balancer: kafka.LeastBytes{}, }) // 发送消息 for i : 0; i 10; i { message : fmt.Sprintf(Hello, Kafka! %d, i) err : w.WriteMessages(context.Background(), kafka.Message{ Key: []byte(fmt.Sprintf(key-%d, i)), Value: []byte(message), }, ) if err ! nil { log.Printf(Failed to write message: %v, err) } else { fmt.Printf( [x] Sent %s\n, message) } time.Sleep(500 * time.Millisecond) } // 关闭生产者 if err : w.Close(); err ! nil { log.Fatalf(Failed to close writer: %v, err) } }消费者package main import ( context fmt log github.com/segmentio/kafka-go ) func main() { // 创建消费者 r : kafka.NewReader(kafka.ReaderConfig{ Brokers: []string{localhost:9092}, Topic: test-topic, Partition: 0, MinBytes: 10e3, // 10KB MaxBytes: 10e6, // 10MB }) // 消费消息 for { msg, err : r.ReadMessage(context.Background()) if err ! nil { log.Printf(Failed to read message: %v, err) break } fmt.Printf( [x] Received message: key%s, value%s\n, string(msg.Key), string(msg.Value)) } // 关闭消费者 if err : r.Close(); err ! nil { log.Fatalf(Failed to close reader: %v, err) } }4. NATS在Go中的应用NATS是一个轻量级、高性能的消息系统适合实时应用支持发布/订阅、请求/响应、队列组等模式。安装和配置# 安装NATS docker run -d --name nats -p 4222:4222 nats:latest # 安装Go客户端 go get github.com/nats-io/nats.go示例代码发布者package main import ( fmt log time github.com/nats-io/nats.go ) func main() { // 连接到NATS服务器 nc, err : nats.Connect(nats://localhost:4222) if err ! nil { log.Fatalf(Failed to connect to NATS: %v, err) } defer nc.Close() // 发布消息 for i : 0; i 10; i { message : fmt.Sprintf(Hello, NATS! %d, i) err : nc.Publish(foo, []byte(message)) if err ! nil { log.Printf(Failed to publish message: %v, err) } else { fmt.Printf( [x] Published %s\n, message) } time.Sleep(500 * time.Millisecond) } }订阅者package main import ( fmt log github.com/nats-io/nats.go ) func main() { // 连接到NATS服务器 nc, err : nats.Connect(nats://localhost:4222) if err ! nil { log.Fatalf(Failed to connect to NATS: %v, err) } defer nc.Close() // 订阅消息 sub, err : nc.Subscribe(foo, func(m *nats.Msg) { fmt.Printf( [x] Received %s\n, string(m.Data)) }) if err ! nil { log.Fatalf(Failed to subscribe: %v, err) } defer sub.Unsubscribe() fmt.Println( [*] Waiting for messages. To exit press CTRLC) select {} // 阻塞 }5. 消息队列的最佳实践消息格式设计使用JSON或Protocol Buffers结构化的消息格式便于序列化和反序列化包含必要的元数据如消息ID、时间戳、版本号等消息大小控制避免发送过大的消息影响性能错误处理和重试机制实现重试策略使用指数退避算法避免雪崩效应死信队列处理无法消费的消息监控和告警及时发现和处理错误消息幂等性使用唯一消息ID确保消息处理的幂等性实现幂等性检查在消费者端检查消息是否已经处理过使用事务确保消息处理和业务操作的原子性监控和可观测性监控消息队列的健康状态如队列长度、消费速率等监控消费者的处理状态如消费延迟、失败率等使用分布式追踪跟踪消息的完整生命周期6. 实际应用场景异步处理订单处理将订单创建和处理分离提高系统响应速度邮件发送异步发送邮件不阻塞主流程图像处理异步处理图像如 resize、滤镜等事件驱动架构微服务间通信使用消息队列作为事件总线实现服务间的解耦业务事件处理如用户注册、订单支付等事件的处理数据流处理实时处理和分析数据流微服务间通信服务解耦服务之间通过消息队列通信减少直接依赖可靠通信确保消息的可靠投递即使服务暂时不可用流量控制通过消息队列缓冲控制服务间的流量日志收集集中式日志将分散的日志收集到消息队列然后统一处理实时分析实时分析日志发现问题和异常日志归档将日志持久化到存储系统用于后续分析7. 性能优化批量处理批量发送减少网络往返提高吞吐量批量消费减少处理开销提高消费效率连接池复用连接避免频繁创建和关闭连接连接管理监控连接状态及时处理异常消息压缩压缩消息减少网络传输和存储开销选择合适的压缩算法根据消息特性选择合适的压缩算法消费组设计合理分配分区根据消费者数量和处理能力分配分区负载均衡确保每个消费者的负载均衡故障转移当消费者失败时其他消费者能够接管其工作8. 代码优化建议1. 错误处理优化原始代码logs, fanout, true, false, false, false, nil, ) if err ! nil { log.Fatalf(Failed to declare an exchange: %v, err) }优化建议if err : ch.ExchangeDeclare( logs, fanout, true, false, false, false, nil, ); err ! nil { log.Fatalf(Failed to declare an exchange: %v, err) }2. 上下文管理原始代码kafka.Message{ Key: []byte(fmt.Sprintf(key-%d, i)), Value: []byte(message), }, )优化建议ctx, cancel : context.WithTimeout(context.Background(), 5*time.Second) defer cancel() err : w.WriteMessages(ctx, kafka.Message{ Key: []byte(fmt.Sprintf(key-%d, i)), Value: []byte(message), }, )3. 连接管理原始代码conn, err : amqp.Dial(amqp://guest:guestlocalhost:5672/) if err ! nil { log.Fatalf(Failed to connect to RabbitMQ: %v, err) } defer conn.Close()优化建议func connectRabbitMQ() (*amqp.Connection, error) { var conn *amqp.Connection var err error // 重试连接 for i : 0; i 5; i { conn, err amqp.Dial(amqp://guest:guestlocalhost:5672/) if err nil { return conn, nil } log.Printf(Failed to connect to RabbitMQ, retrying... (%d/5), i1) time.Sleep(time.Second * time.Duration(i1)) } return nil, err } conn, err : connectRabbitMQ() if err ! nil { log.Fatalf(Failed to connect to RabbitMQ: %v, err) } defer conn.Close()4. 消息处理优化原始代码for d : range msgs { fmt.Printf( [x] Received %s\n, d.Body) }优化建议// 使用工作池处理消息 workers : 10 jobs : make(chan amqp.Delivery, 100) // 启动工作池 for i : 0; i workers; i { go func(id int) { for d : range jobs { fmt.Printf(Worker %d: [x] Received %s\n, id, d.Body) // 处理消息... } }(i) } // 分发消息 for d : range msgs { jobs - d }9. 实际项目案例订单处理系统系统架构订单服务接收订单请求发送订单消息到RabbitMQ库存服务消费订单消息更新库存支付服务消费订单消息处理支付通知服务消费订单消息发送通知代码示例// 订单服务 - 生产者 func createOrder(order Order) error { // 保存订单到数据库 if err : saveOrder(order); err ! nil { return err } // 发送订单消息 message, err : json.Marshal(order) if err ! nil { return err } err ch.Publish( orders, order.created, false, false, amqp.Publishing{ ContentType: application/json, Body: message, }, ) return err } // 库存服务 - 消费者 func consumeOrderMessages() { // 绑定队列到交换机 err : ch.QueueBind( inventory-orders, order.created, orders, false, nil, ) if err ! nil { log.Fatalf(Failed to bind queue: %v, err) } // 消费消息 msgs, err : ch.Consume( inventory-orders, , false, // 手动确认 false, false, false, nil, ) if err ! nil { log.Fatalf(Failed to register consumer: %v, err) } // 处理消息 for d : range msgs { var order Order if err : json.Unmarshal(d.Body, order); err ! nil { log.Printf(Failed to unmarshal message: %v, err) d.Nack(false, false) continue } // 更新库存 if err : updateInventory(order); err ! nil { log.Printf(Failed to update inventory: %v, err) d.Nack(false, true) // 重新入队 continue } d.Ack(false) } }日志收集系统系统架构应用服务发送日志消息到Kafka日志处理服务消费Kafka消息处理和分析日志存储服务将处理后的日志存储到Elasticsearch可视化服务提供日志查询和可视化代码示例// 应用服务 - 生产者 func logMessage(level, message string) { logEntry : LogEntry{ Level: level, Message: message, Timestamp: time.Now(), Service: my-service, } messageBytes, err : json.Marshal(logEntry) if err ! nil { log.Printf(Failed to marshal log entry: %v, err) return } err w.WriteMessages(context.Background(), kafka.Message{ Key: []byte(logEntry.Service), Value: messageBytes, }, ) if err ! nil { log.Printf(Failed to write log message: %v, err) } } // 日志处理服务 - 消费者 func consumeLogMessages() { r : kafka.NewReader(kafka.ReaderConfig{ Brokers: []string{localhost:9092}, Topic: logs, GroupID: log-processing-group, MinBytes: 10e3, MaxBytes: 10e6, }) for { msg, err : r.ReadMessage(context.Background()) if err ! nil { log.Printf(Failed to read message: %v, err) continue } var logEntry LogEntry if err : json.Unmarshal(msg.Value, logEntry); err ! nil { log.Printf(Failed to unmarshal log entry: %v, err) continue } // 处理日志 processLogEntry(logEntry) } }10. 总结消息队列是构建分布式系统的重要组件它可以解耦系统组件提高系统的可靠性、可扩展性和弹性。在Go语言中我们可以使用多种消息队列系统如RabbitMQ、Kafka、NATS等来满足不同的应用场景。通过本文的学习你应该掌握了消息队列的基本概念和优势常见消息队列系统的特点和使用方法Go语言中如何使用各种消息队列消息队列的最佳实践和性能优化实际应用场景和项目案例在实际项目中选择合适的消息队列系统需要考虑以下因素可靠性要求是否需要确保消息不丢失吞吐量要求系统需要处理的消息量延迟要求消息处理的延迟要求复杂性系统的复杂度和维护成本生态系统是否有完善的工具和库支持通过合理使用消息队列可以构建出更加可靠、可扩展和高性能的分布式系统。

相关文章:

Go语言的消息队列应用

Go语言的消息队列应用 1. 消息队列简介 消息队列是一种在分布式系统中用于异步通信的组件,它允许不同的服务之间通过消息进行通信,而不需要直接相互调用。消息队列可以解耦系统组件,提高系统的可靠性、可扩展性和弹性。 消息队列的优势 解耦&…...

YOLOv11涨点改进| AAAI 2025 |自研创新首发、特征融合改进篇| 使用TAMoE任务自适应混合专家模块,多专家协同合作,各司其职,助力各种任务的目标检测,图像分割,多模态融合目标检测涨点

一、本文介绍 🔥本文给大家介绍使用 TAMoE任务自适应混合专家模块 改进YOLOv11网络模型,把原本固定的特征传递与融合方式改造成一种自适应的特征分配机制,使模型能够根据不同检测层和不同目标尺度的需求,动态选择更合适的特征组合来参与主干网络、颈部网络或检测头的融合…...

计算机毕业设计:Python地铁多维度运营分析与数据管理系统 Django框架 数据分析 可视化 大数据 机器学习 深度学习(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

SMU Debug Tool完全指南:AMD Ryzen硬件调试的终极解决方案

SMU Debug Tool完全指南:AMD Ryzen硬件调试的终极解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...

AI教程——让每个人都能高效写出好故事

📖 AI小说创作系统:让每个人都能高效写出好故事 第一章:创作者的痛点在哪里? 写小说并不只是“把故事写出来”那么简单。很多创作者在第一章之后就陷入了困境: * 情节没头绪:故事开了头,但不知道怎么发展。 * 人物难塑造:角色扁平、动机混乱、行为前后不一。 * 设…...

AI for Science 之数论:当人工智能叩响数学王冠的大门

AI for Science 之数论:当人工智能叩响数学王冠的大门 引言 数论,被誉为“数学的皇冠”,以其问题的纯粹与结论的深刻,吸引着从欧几里得到高斯的无数智者。它研究整数的性质,是数学中最古老、最基础的分支之一。如今&…...

从选题到发布全托管:我用OpenClaw搭建了个人自媒体AI流水线

一、引言:内容创作者的普遍痛点 作为技术博主,相信很多人都遇到过这些问题: 选题焦虑:每天花1-2小时刷各大平台找热点,不知道写什么内容读者喜欢效率低下:写一篇技术文章需要查资料、写内容、排版、配图、同…...

2026届最火的六大降AI率平台实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要让AIGC(人工智能生成内容)检测率降低,关键之处便在于把…...

2025届毕业生推荐的六大降重复率网站推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对用户试图降低文本里人工智能生成内容的可识别度,降AIGC工具发挥作用&#xf…...

2025届必备的十大降重复率助手实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对维普系统有的AI检测机制,要是想降低生成文本的机器特征,那就得从…...

2025最权威的五大AI辅助论文方案实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于借助人工智能去生成文本之际,原始输出常常带有显著的模式化印迹。为达成“降AI…...

2026届最火的AI论文助手推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要想切实有效地把文本的AIGC检测概率给降低下去,就得从词汇多样性、句式结构以及…...

综合能源系统中的经济-碳协调:最优调度和灵敏度分析【IEEE33节点】附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...

Grok 4.1 API 完全指南:性能实测、成本测算与接入方案(2026)

上周 xAI 突然放出了 Grok 4.1,我当天晚上就拿到了 API 访问权限。说实话,Elon Musk 的团队这次搞出来的东西让我有点意外——不是那种「又一个 GPT 竞品」的感觉,而是在长上下文和实时信息检索这两个维度上,确实拉开了一些差距。…...

如何从零搭建Cubli_Mini:开源自平衡机器人完整制作指南

如何从零搭建Cubli_Mini:开源自平衡机器人完整制作指南 【免费下载链接】Cubli_Mini 项目地址: https://gitcode.com/gh_mirrors/cu/Cubli_Mini Cubli_Mini是一款令人惊叹的开源自平衡立方体机器人项目,它通过三个正交安装的飞轮实现姿态控制&am…...

突破企业AI应用开发瓶颈:Awesome-Dify-Workflow无代码解决方案深度剖析

突破企业AI应用开发瓶颈:Awesome-Dify-Workflow无代码解决方案深度剖析 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/…...

基于STM32实现OTABootLoader 第五章——OTA功能开发【下】

三、开发客户端ESP82661、自定义AT指令集(1)实际上,Wi-Fi模块通常配有官方的AT指令集,只要刷写官方提供的固件即可(但可能功能不全),不过,AT指令本身就是基于串口通信实现的一种指令…...

从一次现场故障说起:如何通过分析三相变压器感应电动势的谐波来预判铁芯隐患?

三相变压器谐波诊断实战:从波形异常到铁芯隐患精准预判 去年夏天,某220kV变电站的主变在例行巡检中被发现输出电压波形出现明显畸变——这本是电力运维中常见的"小异常",但当我们深入分析谐波成分后,却揭露出一个潜在的…...

人声分离实战指南:从UVR、Demucs到Spleeter的模型选型与场景适配

1. 人声分离技术入门:为什么我们需要它? 第一次接触人声分离技术是在去年帮朋友做婚礼视频的时候。当时需要把现场嘈杂的背景音和人声分开,试了各种音频编辑软件都没法完美解决,直到发现了这些开源工具。简单来说,人声…...

SpringBoot-基础面试篇

什么是 Spring Boot?Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,使开发者能快速上手。为什么要用Spring…...

光学工程师进阶指南:从入门到精通的实战路径

1. 光学工程师的职业发展路径 光学工程师的成长就像搭积木,需要从最基础的模块开始,一层层往上搭建。我刚入行时也走过不少弯路,后来才明白这个职业的发展是有明确路径的。一般来说,我们可以把成长过程分为三个阶段:初…...

云原生下的PostgreSQL高可用实战:在K8s里用StatefulSet和Patroni API告别VIP和HAProxy

云原生时代的PostgreSQL高可用架构:基于Kubernetes与Patroni的实践指南 当企业的数据库基础设施全面转向云原生环境时,传统基于虚拟机的高可用方案显得格格不入。在Kubernetes生态中,StatefulSet控制器和Patroni的Kubernetes原生集成让我们能…...

知网维普都要过,AI率85%用哪款工具最合适

越来越多高校开始同时要求知网和维普检测,这让选工具变得更复杂了——不是只要过一个平台,而是要同时达标。 AI率85%,知网和维普都要过20%以下,这种情况用哪款工具最合适? 知网和维普的算法差异 先说一个背景知识&a…...

知网检测AI率90%,我用这个方法两天降到12%

三月底,距离论文提交还有8天,知网AIGC检测报告出来了:AI率90%。 我当时的反应就是愣在那里。90%,这意味着几乎整篇论文都被标红了。后来用两天时间,把AI率降到了12%。今天把这个过程完整记录下来,因为我知…...

预算有限AI率还有80%,性价比最高的降AI方案

AI率80%,但预算只有100-200元,怎么处理? 这是一个真实存在的困境。不同工具的定价差异很大,预算不够时怎么取舍,怎么用最少的钱解决问题? 这篇文章给出不同预算下的最优方案。 先了解各工具定价 工具定…...

比话降AI和嘎嘎降AI处理80%+AI率哪个更好

比话降AI和嘎嘎降AI是目前市面上处理极高AI率最有效的两款工具,但很多人不知道该选哪个。 这篇文章做一个直接的对比:两款工具在AI率80%场景下,各有什么优势和劣势,你的情况适合哪个。 基础信息对比 项目比话降AI嘎嘎降AI官网b…...

比话降AI实测:AI率87%的论文降到11%全程记录

这篇是比话降AI的真实使用记录,不是广告软文,是我帮朋友处理论文的完整过程。 朋友的情况:研究生论文,4.2万字,知网AIGC检测87%,距离提交截止7天。 为什么选比话降AI 比话降AI(www.bihuapass…...

抖音无水印视频批量下载器深度解析:从架构设计到实战应用

抖音无水印视频批量下载器深度解析:从架构设计到实战应用 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...

Source Han Serif CN:开源宋体的技术特性与跨场景应用指南

Source Han Serif CN:开源宋体的技术特性与跨场景应用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 一、技术特性深度剖析 1.1 字体技术架构解析 Source Han Serif…...

hsjdvfjfgdhdydh

一、OpenAI 1.OpenAI是什么简单来说,OpenAI 大模型 是由美国人工智能公司 OpenAI 开发的一系列大型语言模型(LLMs) 。你可以把它们想象成拥有巨大“知识储备”和“学习能力”的超级大脑,它们被训练用来理解和生成人类语言&#xf…...