RabbitMQ: 消息中间件技术选型

详解消息中间件及其应用场景和常用消息中间件的技术选型(RabbitMQ、Kafka 、RocketMQ、ActiveMQ) 消息中间件简介 消息中间件的使用场景 消息中间件的产生背景、特点和常用协议 常用消息中间件介绍(RabbitMQ、Kafka 、RocketMQ、ActiveMQ) 常用消息中间件的对比 常用消息中间件,如何技术选型? 阅读详情

主流消息中间件技术选型指南


核心问题:ActiveMQ、RabbitMQ、RocketMQ、Kafka 的定位差异与适用场景

中间件特点与定位适用场景局限性
ActiveMQApache 基金会早期产品,支持 JMS 规范,兼容 JDBC 持久化(MySQL/PG/SQL Server)传统企业级系统社区活跃度低,千级队列性能骤降,漏洞修复慢
RabbitMQ当前最主流的 AMQP 实现,基于 Erlang 语言,支持镜像队列、消息确认、插件扩展互联网/金融等高可靠性业务场景Erlang 语言小众,中央节点可能成瓶颈
RocketMQ阿里为双十一设计,支持亿级消息堆积、严格顺序消息,Java 开发便于二次开发电商等高并发、大数据量场景运维复杂度高,社区成熟度低于 RabbitMQ
KafkaLinkedIn 开发的分布式日志系统,原生支持分区、批量消息、快速持久化大数据/日志采集场景消息可靠性弱,不支持消费失败重试
  1. Apache ActiveMQ

    • 特点:
      • 基于 Java 开发,遵循 JMS 规范,支持 OpenWire、REST 等协议。
      • 数据持久化可通过 JDBC 连接 MySQL、PostgreSQL 等数据库实现。
      • 提供集群代理和监控安全机制。
    • 劣势:
      • 社区活跃度低,版本迭代缓慢(如 5.x 版本 Bug 修复滞后)。
      • 性能瓶颈明显:队列数量超千级时吞吐量显著下降。
    • 适用场景:传统企业级应用(因维护成本高,不推荐新项目采用)。
  2. RabbitMQ

    • 特点:
      • 当前最主流消息中间件,支持 AMQP 协议,提供高可靠性(消息确认、镜像队列)。
      • 基于 Erlang 开发,天生高并发,网络 I/O 性能媲美原生 Socket。
      • 插件生态丰富(如管理界面插件),文档齐全,社区活跃。
    • 劣势:
      • Erlang 语言小众,二次开发门槛高。
      • 中央节点架构可能引入延迟。
    • 适用场景:全行业通用(金融、互联网等),尤其适合需高可靠性的业务(如订单系统)。
  3. Apache RocketMQ

    • 特点:
      • 阿里开源,支持亿级消息堆积,严格保证消息顺序性。
      • 高性能持久化:单机支持超 1 万队列,数据双写(内存+磁盘)。
    • 劣势:
      • 客户端支持较少(仅 Java/C++ 成熟),无成熟 Web 管理界面。
      • 配置复杂,运维团队需深度掌握(社区成熟度低于 RabbitMQ)。
    • 适用场景:高并发电商业务(如双十一大促),需强顺序性场景。
  4. Apache Kafka

    • 特点:
      • 专为大数设计:分区架构支持快速持久化、批量消息处理。
      • 高吞吐量,适用于日志收集、流处理(如 ELK 栈)。
    • 劣势:
      • 消息可靠性弱:无重试机制,可能存在投递丢失。
      • 单机超 64 个分区时性能劣化。
    • 适用场景:日志分析、大数据管道(不适用于强一致性业务如支付系统)。

精要:

  • ActiveMQ:历史成熟但已边缘化。
  • RabbitMQ:通用首选,平衡可靠性与生态。
  • RocketMQ:高性能场景备选,需技术储备。
  • Kafka:专用大数据领域,非业务系统适用。

选型结论:

  1. 通用首选:若仅部署一套中间件,RabbitMQ 是唯一推荐,因其广泛适用性(金融/互联网)、高可靠性及活跃社区。
  2. 特定场景:
    • 超大数据吞吐 → Kafka(日志分析、用户行为跟踪);
    • 电商级高并发 → RocketMQ(需配套专业运维团队);
  3. 淘汰选项:ActiveMQ 因社区停滞和性能瓶颈,不再建议用于新系统

选型决策矩阵:

场景首选方案次选方案
金融业务(强一致性)RabbitMQ-
电商秒杀(高并发)RocketMQRabbitMQ
日志处理(大数据量)Kafka-

RabbitMQ 高性能的核心基因:Erlang 语言


四大底层优势:

  1. 并发模型:Erlang 轻量级进程切换效率远超 C/Java,单节点可管理百万级并发连接;
  2. 网络性能:Socket 通信延迟与原生 C 持平,IO 吞吐量达 10Gbps+;
  3. 跨平台性:基于 BEAM 虚拟机实现 Linux/Windows 性能一致性;
  4. 可靠性保障:源于电信交换机语言的基因,支持热代码升级(零停机维护)。

RabbitMQ 的性能优势源于其底层技术栈:

  1. Erlang 语言特性:
    • 专为交换机设备设计,面向并发编程,进程间上下文切换效率远超 C/Java。
    • 基于 BEAM 虚拟机运行,跨平台部署一致性高。
  2. 网络 I/O 优化:
    • 网络延迟与原生 Socket 持平,消息吞吐量可达 10万+/秒(单节点)。
  3. 架构设计:
    • 镜像队列:数据多节点冗余,避免单点故障
    • Channel 复用:单 TCP 连接支持多逻辑通道,减少资源开销
    • OTP热代码升级:服务不中断更新
    • Supervisor树监控进程自动重启

行业应用:

  • 互联网:饿了么、美团(日均千亿级消息,运维团队零故障上报);
  • 金融:渣打、中银(微服务通信核心组件,替代传统 ESB)。

关键提示:Erlang 的分布式特性使 RabbitMQ 天然适配云原生架构,无需额外改造即可部署 Kubernetes 集群

RabbitMQ 的灵魂:AMQP 协议核心架构

Broker
Connection
Connection
Binding
Channel
Channel
Exchange
Virtual Host
Queue
Publisher
Broker
Consumer

AMQP(Advanced Message Queuing Protocol)是 RabbitMQ 的底层规范,定义了消息流转机制:

+-------------+       +-----------------+       +-------------+
| Publisher   | ---> | Exchange        | ---> | Queue       | ---> Consumer
| (Producer)  | <--- | (Routing Engine) | <--- | (Message Store) |
+-------------+       +-----------------+       +-------------+

AMQP 组件全解析:

Connection
Virtual Host
Binding
Connection
Publisher
Broker
Exchange
Queue
Consumer
  1. Broker:消息代理服务器(RabbitMQ 实例);
  2. Virtual Host:虚拟隔离区(类比 Kubernetes Namespace);
    • 虚拟隔离环境,支持多租户资源分割(如 /prod、/test)
  3. Connection/Channel:
    • Connection:物理 TCP 连接(复用 HTTP/AMQP 端口);
    • Channel:逻辑连接(单 Connection 多 Channel 降低资源开销);
  4. Exchange→Queue 路由链:
    • Routing Key:消息的“信封地址”(字符串标签),消息路由标签
    • Binding:Exchange 与 Queue 的虚拟链路;
    • Queue:消息缓存队列(FIFO 存储)。

核心规则:

  • 生产者仅关注 Exchange,不感知 Queue 存在;
  • 消费者仅监听 Queue,不关心消息来源。

协议价值:

  • 统一 RabbitMQ 对外接口,掌握 AMQP 即掌握 RabbitMQ 核心逻辑

RabbitMQ 的心脏:Exchange 交换机工作原理解析


1 ) Direct Exchange(直接路由)

  • 规则:Routing Key 精确匹配 Binding Key;
  • 用例:订单状态更新(Key=order.status)。
    // NestJS生产者示例
    import { Controller } from '@nestjs/common';
    import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';
     
    @Controller()
    export class DirectProducer {
      constructor(private readonly amqp: AmqpConnection) {}
     
      async sendOrderMsg() {
        await this.amqp.publish('orders.direct', 'order.create', { 
          id: Date.now(), 
          item: 'Laptop' 
        });
      }
    }
    
  • 再来看示例:
    • Binding Key: coffee → 队列 coffee_queue
    • 发送 routing_key=coffee 的消息仅路由至 coffee_queue

2 ) Fanout Exchange(广播路由)

  • 规则:无视 Routing Key,消息复制到所有绑定队列;
  • 用例:系统通知广播(如运维告警)。
    RabbitMQ 命令:绑定队列到 Fanout Exchange 
    rabbitmqadmin declare binding source=alerts_exchange destination=slack_queue 
    rabbitmqadmin declare binding source=alerts_exchange destination=sms_queue 
    
  • 路由规则:无视RoutingKey,广播至所有绑定队列
    # RabbitMQ配置片段
    exchange:
      name: notifications.fanout
      type: fanout
    queues:
      - name: email_queue
        bindingKey: '#' # 任意Key均可
      - name: sms_queue
        bindingKey: '#'
    

3 ) Topic Exchange(通配路由)

  • 规则:
    • *:匹配一个单词(例:user.* → user.created/user.deleted);
    • #:匹配零或多个单词(例:log.# → log.error.db/log.info);
  • 用例:多维度日志分类(Key=log.error.db)
    // 消费者绑定键配置
    {
      exchange: 'logs_exchange',
      bindingKey: 'log.*.db'  // 匹配 db 相关的错误/信息日志
    }
    
  • 示例:
    • 队列绑定键:beverage.*.sweet
    • 消息 routing_key=beverage.tea.sweet 匹配成功
  • 最佳实践:优先使用 Topic Exchange,可通过限制通配符降级为 Direct 模式

业务场景:

绑定键设计示例
exchange: inventory.topic
queue_bindings:
  - queue: us_stock 
    key: 'stock.usa.#'  # 匹配所有美国库存消息
  - queue: eu_urgent
    key: '*.critical'   # 匹配所有紧急事件

运维关键配置


1 ) 镜像队列(高可用)

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}' 

2 ) 内存控制(防OOM)

# rabbitmq.conf
vm_memory_high_watermark.relative = 0.6 
disk_free_limit.absolute = 5GB

3 ) TLS加密传输

openssl req -x509 -newkey rsa:2048 -days 365 -nodes \
  -keyout rabbit.key -out rabbit.crt

调试工具链推荐


1 ) Web控制台:http://localhost:15672
2 ) 命令行诊断:

rabbitmq-diagnostics status # 节点状态
rabbitmqctl list_queues name messages_ready # 队列积压

3 ) 流量监控:Prometheus + Grafana集成

初学者建议:通过 RabbitMQ Simulator 交互式实验掌握路由机制

架构设计启示


  1. 解耦方向:
    • 生产者仅关注Exchange,消费者仅监听Queue
  2. 弹性策略:
    • 死信队列(Dead Letter)处理异常消息
    • 备用交换器(Alternate Exchange)容错
  3. 性能铁律:
    • 单Channel吞吐 ≦ 5K msg/s,需横向扩展Channel

工程示例:1


1 ) 方案 1:基础消息生产/消费

// 初始化连接 (app.module.ts)
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
 
@Module({
  imports: [
    RabbitMQModule.forRoot(RabbitMQModule, {
      exchanges: [{ name: 'order_exchange', type: 'direct' }],
      uri: 'amqp://user:pass@localhost:5672',
      connectionInitOptions: { wait: true },
    }),
  ],
})
export class AppModule {}
 
// 生产者服务 (order.service.ts)
@Injectable()
export class OrderService {
  constructor(private readonly amqpConnection: AmqpConnection) {}
 
  async publishOrderEvent(order: Order) {
    await this.amqpConnection.publish('order_exchange', 'order.created', order);
  }
}
 
// 消费者 (payment.consumer.ts)
@Controller()
export class PaymentConsumer {
  @RabbitSubscribe({
    exchange: 'order_exchange',
    routingKey: 'order.created',
    queue: 'payment_queue',
  })
  async handleOrderCreated(order: Order) {
    await processPayment(order.id);
  }
}

2 ) 方案 2:高可用镜像队列部署

步骤:

  1. 集群节点声明:
    # 节点加入集群
    rabbitmqctl stop_app
    rabbitmqctl join_cluster rabbit@node1
    rabbitmqctl start_app 
    
  2. 策略配置(HA 模式):
    rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}' 
    
  3. NestJS 重连策略:
    // 配置重试逻辑 
    RabbitMQModule.forRootAsync({
      useFactory: () => ({
        connectionInitOptions: { 
          wait: false,
          reject: true,
          timeout: 5000,
        },
        reconnectOptions: {
          retryDelay: 3000, // 3 秒重试间隔 
          maxRetries: 10    // 最大重试次数 
        }
      }),
    })
    

3 ) 方案 3:死信队列(DLX)保障消息可靠性

// 定义死信交换机和队列
@Module({
  imports: [
    RabbitMQModule.forRootAsync({
      useFactory: () => ({
        exchanges: [
          { name: 'dlx_exchange', type: 'direct' },
          { name: 'main_exchange', type: 'topic' },
        ],
        queues: [
          {
            name: 'dead_letter_queue',
            options: { durable: true },
          },
          {
            name: 'main_queue',
            options: {
              deadLetterExchange: 'dlx_exchange', // 绑定死信交换机
              messageTtl: 60000, // 60 秒未消费则转入 DLX 
            },
          },
        ],
      }),
    }),
  ],
})
export class DeadLetterModule {}

工程示例:2


以下提供三种场景的完整实现,包含配置、生产/消费逻辑及异常处理。

1 ) 方案 1:基本消息生产与消费

import { NestFactory } from '@nestjs/core';  
import { AppModule } from './app.module';  
import * as amqp from 'amqplib';  
 
async function bootstrap() {  
  const app = await NestFactory.create(AppModule);  
  // RabbitMQ 连接配置  
  const connection = await amqp.connect('amqp://localhost:5672');  
  const channel = await connection.createChannel();  
 
  // 声明直连交换机与队列  
  const exchange = 'orders_direct';  
  const queue = 'payment_queue';  
  await channel.assertExchange(exchange, 'direct', { durable: true });  
  await channel.assertQueue(queue, { durable: true });  
  await channel.bindQueue(queue, exchange, 'payment');  
 
  // 生产者逻辑  
  const sendPaymentOrder = (orderId: string) => {  
    channel.publish(exchange, 'payment', Buffer.from(orderId));  
    console.log(`[x] Sent order ${orderId}`);  
  };  
 
  // 消费者逻辑  
  channel.consume(queue, (msg) => {  
    if (msg) {  
      console.log(`[x] Processing: ${msg.content.toString()}`);  
      channel.ack(msg); // 手动确认消息  
    }  
  });  
 
  await app.listen(3000);  
}  
bootstrap();  

配置要点:

  • 交换机/队列声明时设置 durable: true 保证持久化。
  • 消费者需手动 ack 消息避免丢失。

2 ) 方案 2:Topic 路由实现事件分发

import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';  
import { Module } from '@nestjs/common';  
 
@Module({  
  imports: [  
    RabbitMQModule.forRoot(RabbitMQModule, {  
      exchanges: [  
        { name: 'events_topic', type: 'topic' },  
      ],  
      uri: 'amqp://localhost:5672',  
    }),  
  ],  
})  
export class AppModule {}  
 
// 生产者服务  
import { Injectable } from '@nestjs/common';  
import { RabbitRPC } from '@golevelup/nestjs-rabbitmq';  
 
@Injectable()  
export class EventService {  
  @RabbitRPC({  
    exchange: 'events_topic',  
    routingKey: 'order.#',  
    queue: 'order_events_queue',  
  })  
  handleOrderEvent(msg: { event: string }) {  
    console.log(`[x] Received: ${msg.event}`);  
  }  
}  

路由规则:

  • order.# 匹配 order.created、order.paid.success 等多级事件。

3 ) 方案 3:镜像队列高可用部署
RabbitMQ 集群配置命令:

节点1 启动  
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=node1 rabbitmq-server -detached  
 
节点2 加入集群  
rabbitmqctl stop_app  
rabbitmqctl join_cluster rabbit@node1  
rabbitmqctl start_app  
 
创建镜像队列  
rabbitmqctl set_policy ha-queue "^ha\." '{"ha-mode":"all"}'  

NestJS 中断线重连逻辑:

import { connect } from 'amqplib';  
import { setTimeout } from 'timers/promises';  
 
async function createResilientChannel() {  
  while (true) {  
    try {  
      const conn = await connect('amqp://node1,node2');  
      conn.on('close', () => console.error('Connection lost, retrying...'));  
      return await conn.createChannel();  
    } catch (err) {  
      await setTimeout(5000); // 5秒后重试  
    }  
  }  
}  

高可用设计:

  • 集群节点互备,ha-mode: all 实现队列全镜像。
  • 客户端多节点连接地址支持自动故障转移。

工程示例:3


1 ) 方案1:Direct路由订单系统

// order.module.ts
import { Module } from '@nestjs/common';
import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq';
 
@Module({
  imports: [
    RabbitMQModule.forRoot(RabbitMQModule, {
      exchanges: [
        { name: 'orders.direct', type: 'direct' }
      ],
      uri: 'amqp://user:pass@localhost:5672',
    }),
  ],
  providers: [OrderService],
})
export class OrderModule {}

2 ) 方案2:Topic路由日志收集

// logger.service.ts
import { Injectable } from '@nestjs/common';
import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';
 
@Injectable()
export class LoggerService {
  constructor(private amqp: AmqpConnection) {}
 
  logError(message: string) {
    this.amqp.publish('logs.topic', 'app.error', {
      timestamp: new Date(),
      message,
    });
  }
}

3 ) 方案3:Fanout路由通知中心

docker-compose.yml (生产环境配置)
rabbitmq:
  image: rabbitmq:3.12-management
  ports:
    - "5672:5672"
    - "15672:15672"
  volumes:
    - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
    - ./definitions.json:/etc/rabbitmq/definitions.json # 预声明交换器/队列

RabbitMQ 周边配置全清单


配置项命令示例说明
监控面板启动rabbitmq-plugins enable rabbitmq_management启用 Web 管理界面 (http://localhost:15672)
用户权限管理rabbitmqctl set_permissions -p /vhost user ".*" ".*" ".*"配置虚拟主机权限
磁盘预警阈值rabbitmqctl set_disk_free_limit 1GB防止磁盘写满导致服务中断
TLS 加密通信rabbitmq.config 中配置 SSL 证书路径生产环境强制启用

结语


RabbitMQ 凭借 Erlang 性能基因、AMQP 协议规范性及灵活的 Exchange 路由机制,成为消息中间件首选。选型时:

  • 通用场景选 RabbitMQ,大数据用 Kafka,超高并发考虑 RocketMQ。
  • 工程中通过 NestJS 集成、镜像队列和 Topic 路由可覆盖多数需求。

初学者应掌握:

  1. AMQP 组件关系(Virtual Host/Exchange/Queue)。
  2. 三种 Exchange 类型的适用场景。
  3. 生产级配置(持久化、集群、重试)。

关键点强调:避免直接使用 ActiveMQ;Kafka 勿用于业务订单;RabbitMQ Topic Exchange 可降级为 Direct 模式简化初期使用。

RabbitMQ 作为 微服务通信的基石,其高可靠性设计(镜像队列/ACK 机制)与灵活路由策略(Topic/Direct/Fanout)覆盖了绝大多数业务场景。开发者应重点理解:

  1. AMQP 协议的 Broker→Exchange→Queue 路由链;
  2. Erlang 语言赋予的并发优势;
  3. 集群与灾备方案的落地实践(镜像队列+DLX)。

🔗 延伸学习:

Jetson AGX Orin平台Jetpack5升级Jetpack6,自研载板USB不工作问题调试 1. 问题描述将AGX Orin工业的新板放到定制的载板上当在ubuntu 22和Jetpack 6.1上使用SDKManager刷机时,lsusb为空,并且在引导时没有发现/注册xusb设备。USB C端口正常打开并供电,但似乎没有数据传输。在Ubuntu 18 Jetpack 5.1.4 SDKManager上同样刷机之后,usb C集线器在引导时被正确地发现,显示在lsusb中,并识别/挂载外部驱动器。 阅读详情

相关推荐

车载机器人终极解决方案:从功能叠加到生态融合的颠覆性变革

本文提出一种融合智能汽车与家居技术的车载机器人架构。其创新点包括:1)基于多模态传感器的拟人化硬件设计,实现声源定位误差<5°、体温检测精度±0.3℃;2)跨模态情感计算引擎,综合面部表情、心率等数据构建三维情绪模型;3)协议自适应中间件,支持小米、华为等多品牌智能家居设备即插即用;4)环境自适应舵机控制,-30℃环境下扭矩保持率达92.5%。测试数据显示,该方案使交互步骤减少60%,用户满意度提升58%,日均使用时长增加2.3倍,为"人-车-家"生态融合提供了可行技术路径。

qq_42671193的博客 1130

消息中间件的技术选型心得-RabbitMQ ActiveMQ和ZeroMQ

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 消息中间件的技术选型心

hffyyg的博客 196

matlab2021a版本条件下安装spm

SPM (Statistical Parametric Mapping),中文名叫统计参数映射。统计参数映射是指构建和评估空间扩展的统计过程,用于测试关于功能成像数据的假设。这些想法已经在名为SPM的免费开源软件中得到了实例化。SPM软件包用于脑成像数据序列分析。目前的版本可以分析fMRI, PET, SPECT, EEG和MEG。 可能由于matlab版本更新的问题,按照之前教程所写的安装方法会出现错误,踩了一些坑,但好在最终解决了。。。 1、下载链接,如下 SPM12 Software -...

qq_42356925的博客 8407

消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ

消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ 作者:chszs,转载需注明。博客主页:http://blog.youkuaiyun.com/chszsRabbitMQ、ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?很多开发者面临这个烦恼。下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了。RabbitMQ是AMQP协议领先的一个...

移动开发记录 441

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 809

基于Docker的D435i相机与IMU联合标定实战指南

本文详细介绍了基于Docker的D435i相机与IMU联合标定实战指南,涵盖kalibr镜像构建、IMU标定全流程、双目相机标定技巧及联合标定结果验证。通过Docker容器化部署,简化了复杂依赖环境,提升标定效率与精度,适用于机器人视觉与SLAM应用。

weixin_30872337的博客 241

ActiveMQ、RabbitMQ、Kafka、RocketMQ消息中间件技术选型

消息中间件是分布式系统中重要的组件之一,用于实现异步通信、解耦系统、提高系统可靠性和扩展性。在做消息中间件技术选型时,需要考虑多个因素,包括可靠性、性能、可扩展性、功能丰富性、社区支持和成本等。本文将五种流行的消息中间件技术:ActiveMQ、RabbitMQ、Kafka、RocketMQ和ZeroMQ,进行讲解。

weixin_43749805的博客 2388

Android 车载应用之快速入门

车载 Android 系统也被称为 Android Automotive OS,是对原始 Android 系统的一个功能扩充版本。与手机系统一样,Android Automotive OS 源代码完全开放,第三方供应商和汽车制造商可以官方源码的基础上自行开发和拓展,无论是编程语言还是各项接口,都与 Android 系统保持了一致。

xiangzhihong8的专栏 1113
上一篇: RabbitMQ: 核心原理与异步消息系统实战:从高可用集群到分布式事务框架集成
下一篇: RabbitMQ: 全面安装与运维指南之从基础部署到高级配置
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值