二十分钟带你速通RabbitMQ

【RabbitMQ】什么是RabbitMQ?RabbitMQ有什么用?应用场景有那些? RabbitMQ简称MQ是一套实现了高级消息队列协议的开源消息代理软件,简单来说就是一个消息中间件。是一种程序对程序的通信方法。 阅读详情

一、RabbitMQ 概述

1. 定义

RabbitMQ 是基于 AMQP(高级消息队列协议)的开源消息代理和队列服务器。在分布式系统里,它负责在不同组件间传递消息,实现系统解耦、异步处理与流量削峰。

2. 应用场景

  • 系统解耦:电商系统中,订单系统和库存系统可通过 RabbitMQ 解耦。订单系统生成订单消息后发送到队列,库存系统从队列获取消息处理库存扣减。
  • 异步处理:用户注册时,发送注册邮件这类耗时操作可通过消息队列异步处理,用户注册成功后立即返回结果,邮件发送任务入队等待处理。
  • 流量削峰:秒杀活动中,大量用户请求先进入消息队列,系统按一定速率从队列取请求处理,避免系统因高流量崩溃。

二、RabbitMQ 核心概念

1. 生产者(Producer)

消息的发送方,将消息发送到 RabbitMQ 的交换器(Exchange)。

2. 消费者(Consumer)

消息的接收方,从 RabbitMQ 的队列(Queue)获取消息并处理。

3. 交换器(Exchange)

接收生产者消息,并按路由规则将消息路由到一个或多个队列。常见类型有:

  • 直连交换器(Direct Exchange):根据消息路由键(Routing Key)和绑定键(Binding Key)精确匹配来路由消息。
  • 扇形交换器(Fanout Exchange):将消息广播到所有绑定队列,不考虑路由键。
  • 主题交换器(Topic Exchange):依据消息路由键和绑定键的模式匹配规则路由,绑定键可用 *(匹配一个单词)和 #(匹配零个或多个单词)。
  • 头交换器(Headers Exchange):根据消息头部信息(Headers)决定路由。

4. 队列(Queue)

存储交换器路由过来的消息,供消费者获取处理。

5. 绑定(Binding)

交换器和队列的关联关系,通过绑定键将二者绑定,决定消息从交换器到队列的路由。

6. 虚拟主机(Virtual Host)

RabbitMQ 中的逻辑概念,用于隔离不同应用程序,每个虚拟主机有独立的交换器、队列和绑定。

三、RabbitMQ 安装与启动

1. Ubuntu 安装步骤

echo "deb https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
curl -fsSL https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey | sudo apt-key add -
sudo apt-get update
sudo apt-get install rabbitmq-server

2. 启动与管理

sudo systemctl start rabbitmq-server
sudo systemctl stop rabbitmq-server
sudo systemctl restart rabbitmq-server
sudo systemctl status rabbitmq-server

3. 启用管理界面

sudo rabbitmq-plugins enable rabbitmq_management

启用后,访问 http://localhost:15672,用默认用户名 guest 和密码 guest 登录。

四、基于 Spring Boot 使用 RabbitMQ(注解方式)

1. 项目准备

在 pom.xml 中添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2. 配置文件

application.yml 配置:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

3. 生产者代码示例

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class RabbitMQProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    private static final String EXCHANGE_NAME = "directExchange";
    private static final String ROUTING_KEY = "directRoutingKey";

    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend(EXCHANGE_NAME, ROUTING_KEY, message);
        System.out.println(" [x] Sent '" + message + "'");
    }
}

4. 消费者代码示例

import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Service;

@Service
public class RabbitMQConsumer {
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "directQueue", durable = "true"),
            exchange = @Exchange(name = "directExchange", type = "direct"),
            key = "directRoutingKey"
    ))
    public void receiveMessage(String message) {
        System.out.println(" [x] Received '" + message + "'");
    }
}

5. 测试代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RabbitMQApplication implements CommandLineRunner {
    @Autowired
    private RabbitMQProducer producer;

    public static void main(String[] args) {
        SpringApplication.run(RabbitMQApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        producer.sendMessage("Hello, RabbitMQ with Annotations!");
    }
}

五、RabbitMQ 高级特性

1. 消息确认机制

生产者确认
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ConfirmProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendMessageWithConfirm(String message) {
        CorrelationData correlationData = new CorrelationData("1");
        rabbitTemplate.convertAndSend("directExchange", "directRoutingKey", message, correlationData);
        rabbitTemplate.setConfirmCallback((correlationData1, ack, cause) -> {
            if (ack) {
                System.out.println("Message sent successfully");
            } else {
                System.out.println("Message sent failed: " + cause);
            }
        });
    }
}
消费者确认
import org.springframework.amqp.rabbit.annotation.AcknowledgeMode;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

@Service
public class ConfirmConsumer {
    @RabbitListener(queues = "directQueue", ackMode = AcknowledgeMode.MANUAL)
    public void receiveMessage(org.springframework.amqp.core.Message message,
                               com.rabbitmq.client.Channel channel) throws Exception {
        try {
            System.out.println("Received message: " + new String(message.getBody()));
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
        }
    }
}

2. 消息持久化

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PersistentConfig {
    public static final String PERSISTENT_QUEUE = "persistentQueue";
    public static final String PERSISTENT_EXCHANGE = "persistentExchange";
    public static final String PERSISTENT_ROUTING_KEY = "persistentRoutingKey";

    @Bean
    public Queue persistentQueue() {
        return new Queue(PERSISTENT_QUEUE, true);
    }

    @Bean
    public DirectExchange persistentExchange() {
        return new DirectExchange(PERSISTENT_EXCHANGE, true, false);
    }

    @Bean
    public Binding persistentBinding() {
        return BindingBuilder.bind(persistentQueue()).to(persistentExchange()).with(PERSISTENT_ROUTING_KEY);
    }
}

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class PersistentProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendPersistentMessage(String message) {
        rabbitTemplate.convertAndSend(PersistentConfig.PERSISTENT_EXCHANGE,
                PersistentConfig.PERSISTENT_ROUTING_KEY, message);
    }
}

3. 死信队列

当消息被拒绝(basicReject 或 basicNack)且 requeue 为 false、消息过期或队列达到最大长度时,消息会进入死信队列。

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DeadLetterConfig {
    public static final String NORMAL_QUEUE = "normalQueue";
    public static final String DEAD_LETTER_QUEUE = "deadLetterQueue";
    public static final String NORMAL_EXCHANGE = "normalExchange";
    public static final String DEAD_LETTER_EXCHANGE = "deadLetterExchange";
    public static final String NORMAL_ROUTING_KEY = "normalRoutingKey";
    public static final String DEAD_LETTER_ROUTING_KEY = "deadLetterRoutingKey";

    @Bean
    public Queue normalQueue() {
        return QueueBuilder.durable(NORMAL_QUEUE)
               .withArgument("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE)
               .withArgument("x-dead-letter-routing-key", DEAD_LETTER_ROUTING_KEY)
               .build();
    }

    @Bean
    public Queue deadLetterQueue() {
        return new Queue(DEAD_LETTER_QUEUE, true);
    }

    @Bean
    public DirectExchange normalExchange() {
        return new DirectExchange(NORMAL_EXCHANGE, true, false);
    }

    @Bean
    public DirectExchange deadLetterExchange() {
        return new DirectExchange(DEAD_LETTER_EXCHANGE, true, false);
    }

    @Bean
    public Binding normalBinding() {
        return BindingBuilder.bind(normalQueue()).to(normalExchange()).with(NORMAL_ROUTING_KEY);
    }

    @Bean
    public Binding deadLetterBinding() {
        return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with(DEAD_LETTER_ROUTING_KEY);
    }
}

4. 延迟队列

可通过消息过期时间和死信队列实现。

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DelayProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendDelayMessage(String message, long delay) {
        rabbitTemplate.convertAndSend(DeadLetterConfig.NORMAL_EXCHANGE,
                DeadLetterConfig.NORMAL_ROUTING_KEY, message, msg -> {
                    msg.getMessageProperties().setExpiration(String.valueOf(delay));
                    return msg;
                });
    }
}

六、RabbitMQ 监控与管理

1. 管理界面监控

通过 http://localhost:15672 可实时监控队列消息数量、消费者连接数、消息速率等信息。

2. 命令行工具监控

sudo rabbitmqctl list_queues
sudo rabbitmqctl list_connections
RabbitMQ持久化配置指南:防止节点重启导致消息丢失的完整方案 在分布式系统和消息队列架构中,数据可靠性是生产环境的生命线。消息中间件承担着业务系统解耦与异步通信的重任,而一旦Broker节点发生重启或故障,消息丢失就可能引发数据不一致、报表失真甚至资损。RabbitMQ作为广泛使用的开源消息队列,其持久化机制是保障消息不丢的核心。持久化并非单一开关,而是涉及交换机、队列、消息三个层面的durable配置,同时还需配合publisher confirm确认机制和消费者手动ack,才能关闭生产端、Broker存储、消费端三个丢失窗口。面对大数据量管道,Quorum Que 阅读详情

相关推荐

一键安装OpenStack?PackStack实战指南与避坑手册

从服务器虚拟化到云平台落地,基础设施自动化部署一直是运维和开发者的核心痛点。传统手工搭建常常被依赖冲突和服务间通信问题困扰,而自动化部署工具通过脚本或配置管理工具,将繁琐步骤封装为可重复执行的流程。OpenStack作为主流开源云平台,其组件众多,安装复杂度高。社区中的DevStack、PackStack、Kolla-Ansible分别面向开发调试、实验学习和生产环境。其中PackStack基于Puppet编排,以较低门槛实现“一键安装”的效果。掌握其环境准备、应答文件生成、安装验证与常见故障排查,是初入云

weixin_30843121的博客 54

rabbitMQ的详细介绍

rabbitMQ的详细介绍

wang20010104的博客 7万+

MySQL常见面试题汇总(建议收藏!!!)

目录一、索引相关(1)什么是索引?(2)索引是个什么样的数据结构呢?(3)为什么使用索引?(4)Innodb为什么要用自增id作为主键?(5)Hash 索引和 B+ 树索引有什么区别或者说优劣呢?(6)什么是聚簇索引(6)非聚簇索引一定会回表查询吗?(6)聚簇索引和非聚簇索引的区别(6)MyISAM和InnoDB实现B+树索引方式的区别是什么?(6)MySQL中有四种索引类型,可以简单说说吗?(6)覆盖索引是什么?(6)联合索引是什么?为什么需要注意联合索引中的顺序?(6)创建的索引有没有被使用到?或者说怎

蔡政洁的博客 7万+

【RabbitMQ】MQ的基本概念、RabbitMQ简介及安装

本文涉及MQ的基本概念、RabbitMQ简介、RabbitMQ的安装等内容

十八岁讨厌编程的博客 2万+

计算机视觉之ResNet

RestNet是2015年由微软团队提出的,在当时获得分类任务,目标检测,图像分割第一名。该论文的四位作者何恺明、张祥雨、任少卿和孙剑如今在人工智能领域里都是响当当的名字,当时他们都是微软亚研的一员。实验结果显示,残差网络更容易优化,并且加深网络层数有助于提高正确率。在ImageNet上使用152层的残差网络(VGG net的8倍深度,但残差网络复杂度更低)。对这些网络使用集成方法实现了3.75%的错误率。获得了ILSVRC 2015竞赛的第一名。原文链接这是一篇计算机视觉领域的经典论文。

十年以上架构设计经验,专注于软件架构和人工智能领域,对机器视觉、NLP、音视频等领域都有涉猎 2万+

PyMiMi实战指南:midas_api配置与连接测试详解

本文详细介绍了PyMiMi库中midas_api的配置与连接测试全流程。从环境准备、API密钥获取,到核心的url_cfg配置函数使用,再到通过test_url进行连接验证,提供了清晰的步骤和代码示例。文章重点解析了配置原理、常见错误排查方法(如401错误、连接超时),并强调了API密钥的安全性管理,帮助用户稳固建立Python与Midas Civil NX之间的自动化通信桥梁。

weixin_29044713的博客 686

RabbitMQ介绍以及基本使用

消息队列是一种用于在分布式系统中进行通信的技术。它是一种存储和转发消息的中间件,可以用于将应用程序之间的通信解耦,从而实现高效的异步通信。消息队列允许发送者将消息发送到队列中,而接收者则可以从队列中获取消息并进行处理。这种方式可以帮助系统实现高可用性、高性能、松耦合和可伸缩性。消息队列通常包括生产者(发送消息的应用程序)、消费者(接收消息的应用程序)和队列(存储消息的缓冲区)。RabbitMQ:是由erlang语言开发,基于AMQP(高级消息队列协议)协议实现的一种消息队列。市面上还有很多消息队列,比如Ka

qq_40950398的博客 2万+

Modelsim 安装步骤详解

Modelsim 安装步骤详解目录一、modelsim简述及下载1、简介及特点2、modelsim版本3、modelsim下载二、安装步骤详解三、注册简述四、总结与参考资料1、总结2、参考资料 目录 本篇文章主要对Modelsim SE版本安装步骤的介绍。 一、modelsim简述及下载 1、简介及特点 简介 modelsim是Mentor公司开发的优秀的HDL语言仿真软件。 它能提供友好的仿真环境,采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单

执迷不悟 15万+

RabbitMQ详解

1.1 什么是MQ MQ(Message Quene) : 翻译为 消息队列,通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件 通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。 1.2 MQ有哪些 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka

1万+

RV1126上YOLOv8部署实战:从模型转换到板端推理的完整避坑指南

本文提供了在瑞芯微RV1126芯片上部署YOLOv8目标识别算法的完整实战指南。内容涵盖从模型转换、环境搭建到板端推理代码编写的全流程,重点解析了RKNN-Toolkit使用、量化配置、内存优化及后处理实现等关键环节的常见问题与解决方案,旨在帮助开发者高效避坑,实现边缘AI应用的稳定落地。

pz89012345的博客 567

TP-LINK电信定制摄像头刷机教程:解锁官方功能与固件升级

固件是嵌入式设备的操作系统,控制着硬件的基础功能。其工作原理是通过更新或替换存储在设备非易失性存储器中的程序代码,从而改变设备的行为和功能。这项技术的核心价值在于赋予用户对设备的完全控制权,能够解除厂商或运营商的软件限制,实现功能自定义、性能优化和安全更新。在智能家居、网络设备和物联网领域,固件升级与刷机是常见的工程实践,用于修复漏洞、增加新特性或适配不同平台。本文聚焦于利用TFTP恢复模式这一通用网络设备维护机制,针对TP-LINK电信定制版摄像头,提供一套完整的刷机方案,将设备刷入官方通用版固件,以解除

weixin_34205826的博客 490

rabbitMQ的入门教程

欢迎使用rabbitMQ消息队列 以下全是自己的理解写出,大概看了二十分钟项目,原理跟kafka消息中间件类似其实每个消息中间件的原理都是很类似的,有兴趣可以看看kafka消息队列。 安装rabbit 简单的生产者消费者模式 安装rabbit rabbit的安装就不说了,安装好之后它将是以一个服务的方式存在,不然也不叫消息中间件了,直接上教程 https://www...

yanghaibobo110的博客 1732

【知识点讲解】大模型参数量与计算量(FLOPs)估算方法

指标参数量 (Params)计算量 (FLOPs)含义模型的大小,静态模型的计算复杂度,动态决定因素模型结构(宽度、深度)模型结构 +输入数据(B, S)影响内存占用、磁盘空间运行速度、能耗单位M (百万), B (十亿)工具thopptflopstorchinfothopptflopsfvcore重要提示FLOPs ≠ 速度:FLOPs 是理论计算量。实际速度还受内存带宽 (Memory Bandwidth)并行度硬件架构等因素严重影响。

AI浩 2095

第一篇:RabbitMQ入门

RabbitMQ简介 定义   RabbitMQ是MQ中的一种,MQ(message queue)就是程序员口中常说的消息队列。它在服务与服务的调用过程中加了一层,将原本服务A调用服务B变成服务A将请求打到MQ,服务B自己去MQ拿请求处理(如下图)。 优缺点   通过生活中的案例来描述mq的优缺点。其中快递小哥是服务A,丰巢就是MQ,收件人是服务B。下面我们假设快递小哥送快递是发送请求,收件人收到快递为响应完成。 优点 解耦(提高系统容错率及可维护性) 没有丰巢的情况下,快递小哥尽管打电话通知收件人来

双非二本自学到互联网公司的成长经历,有故事,有干货。 351

基于Transformer的股票市场多因子量化选股模型,深度解析:基于Transformer的股票市场多因子量化选股模型

传统多因子模型通常采用线性回归、岭回归或Lasso回归来估计因子权重,其核心假设是因子与未来收益之间存在线性关系。然而,现实中的股票市场具有典型的非线性、非平稳和高噪声特征。卷积神经网络(CNN)擅长提取局部特征,但难以捕捉全市场股票之间的全局依赖关系;循环神经网络(RNN)及其变体LSTM虽然能处理时间序列,但存在梯度消失问题且难以并行计算。Transformer的self-attention机制能够:直接建模任意两只股票之间的相关性动态计算因子权重而非静态线性组合。

YOLO 250

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

7. RabbitMQ 延时队列

延时队列场景 比如这个库存锁成功了,我们害怕订单后续操作失败了,导致库存没法回滚,我们库存要自己解锁, 那么可以把锁成功的消息,先发给消息队列,但是让消息队列先暂存一会儿。比如我们存上三十分钟, 因为我们现在的订单有可能是成功了,也有可能是失败。 无论是成功失败,我们三十分钟以后,再对订单进行操作,比如订单不支付,我们都给它关了。所以三十分钟以后订单肯定就见分晓了。 四十分钟以后我们把这个消息再发给解锁库存服务,解锁库存服务,一看这个订单早都没有了,或者订单都没有支付,被人取消了。 它就可以把当时锁的库存

UnityAlvin 724

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

RabbitMQ集群搭建与镜像队列配置实战:高可用架构避坑指南

在分布式系统设计中,消息中间件是异步解耦与流量削峰的核心组件,而RabbitMQ凭借稳定性和灵活性成为众多企业的首选。要支撑生产环境的高并发与持续可用,单机部署显然无法满足需求,这就体现出集群架构的关键价值——通过多节点协作实现故障转移与水平扩展。然而,集群的搭建并非简单的节点拼接,Erlang版本兼容性、节点cookie统一、hosts解析与防火墙端口放行,每一步都可能成为隐形的拦路虎。同时,普通集群仅负责元数据共享,真正保障数据不丢失的是镜像队列或Quorum队列机制,需要结合策略配置理解master与

weixin_33173126的博客 328

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RabbitMQ实战指南:从安装部署到Spring Boot集成与故障排查

消息队列是分布式系统中实现异步解耦与流量削峰的关键组件,而RabbitMQ以其灵活的路由机制和成熟的生态成为中小团队的首选。理解生产者、消费者、交换机、绑定与路由键的工作原理,是掌握消息可靠投递的基础。通过队列持久化、消息确认机制与死信队列等特性,RabbitMQ能够有效保障消息不丢失,支撑订单通知、日志处理等业务场景。本文从安装部署入手,结合Spring Boot代码示例,详解核心概念与常见故障排查思路,帮助读者快速落地工程实践。

weixin_42548888的博客 227

ManiSkill GPU并行机器人模拟环境:完整安装配置与快速上手指南

ManiSkill 是基于 SAPIEN 引擎的开源 GPU 并行化机器人操作模拟环境,用一套 Gymnasium 接口完成机器人操作任务的仿真、渲染与策略训练。本文覆盖 ManiSkill 安装、环境配置、常见故障排查,以及最小可运行示例,读完你即可在本机跑通 `PickCube-v1` 并开启多环境并行仿真。 ## 🔧 动手前:确认你的系统环境 ManiSkill 的完整功能依赖 Lin

gitblog_00228的博客 368

Java最新专科到本科4年Java经验,五面阿里(定薪45K),分享我的心得,算法解析大全

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取链图片转存中…(img-RGb9s2Bp-1715422262245)]本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。

2401_84584628的博客 1086

长鑫存储提前批生产管理状态为初试但是还没收到面试通知咋回事?

选择考的啥都有,机器学习和深度学习反而比较少,基础很多。借鉴了别人的题解加上自己的理解1、只有两座监狱,所以两个罪犯要么在同一个监狱要么在不同监狱2、将影响力从大到小排序,从大到小枚举每个冲突,尽可能的让冲突避免(即。题目考察的知识点数组,双指针题目解答方法的文字分析观察可知,time1的后半部分是空的,可以直接覆盖而不会影响结果。1.自我介绍2.拼多多、京东、阿里平台的差一点3,实习经历有什么数据化的表现吗4,对跨境电商了解吗5,英文能力怎么样6,英文自我介绍7,抖音电商的了解8,拼多多。

2301_79125642的博客 2万+

第七天..

无

qw1231rt的博客 115
上一篇: 二十分钟带你速通JUC
下一篇: 静态代理和动态代理的区别
java烤冷面
博客等级 码龄4年 177粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值