10:00面试,10:08就出来了,问的问题过于变态了。。。

10:00面试,10:08就出来了,问的问题过于变态了。。。

消息队列是一种应用耦合、异步处理和流量削峰的技术。它通过将消息存储在队列中,使得生产者和消费者可以在不同的时间、不同的地点进行通信,从而实现了解耦、异步处理和流量削峰。

应用耦合

应用耦合是指系统中各个模块之间的依赖关系。在没有使用消息队列的情况下,各个模块之间需要直接通信,这就导致了模块之间的紧密耦合。而使用了消息队列之后,各个模块只需要与消息队列进行通信,模块之间的依赖关系就降低了,实现了应用解耦。

例如,用户下单后需要通知库存系统进行扣减库存。在没有使用消息队列的情况下,订单系统需要直接调用库存系统的接口,这样就导致了订单系统和库存系统之间的紧密耦合。而使用了消息队列之后,订单系统只需要将下单消息发送到消息队列,库存系统从消息队列中获取下单消息进行处理,这样订单系统和库存系统之间的耦合度就降低了。

异步处理

异步处理是指生产者和消费者可以在不同的时间进行通信。在没有使用消息队列的情况下,生产者和消费者需要同时在线才能进行通信,这就导致了同步处理。而使用了消息队列之后,生产者可以将消息发送到队列中,消费者可以在合适的时间从队列中获取消息进行处理,实现了异步处理。

例如,用户下单后需要发送短信通知。在没有使用消息队列的情况下,订单系统需要等待短信系统处理完成后才能继续执行后续操作,这样就导致了同步处理。而使用了消息队列之后,订单系统只需要将短信通知消息发送到消息队列,短信系统可以在合适的时间从消息队列中获取短信通知消息进行处理,这样订单系统和短信系统就可以进行异步处理了。

流量削峰

流量削峰是指通过消息队列来平衡系统的负载。在高并发场景下,如果没有使用消息队列,系统的负载可能会瞬间达到峰值,导致系统崩溃。而使用了消息队列之后,系统可以将请求先存储在队列中,然后按照一定的速度进行处理,从而实现了流量削峰。

例如,秒杀活动中,大量的用户会在瞬间访问系统,导致系统负载瞬间达到峰值。而在使用了消息队列之后,系统可以将用户的请求先存储在队列中,然后按照一定的速度进行处理,这样就实现了流量削峰。

下面是一个简单的Python代码示例,使用RabbitMQ作为消息队列:

bash 复制代码
import pika

# 生产者
def send_message(queue_name, message):
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue=queue_name)
    channel.basic_publish(exchange='', routing_key=queue_name, body=message)
    connection.close()

# 消费者
def receive_message(queue_name):
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue=queue_name)
    def callback(ch, method, properties, body):
        print("Received message: %s" % body)
    channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=True)
    channel.start_consuming()

# 生产者发送消息
send_message('test_queue', 'Hello, World!')

# 消费者接收消息
receive_message('test_queue')

通过以上代码,我们可以实现一个简单的生产者和消费者模型,使用RabbitMQ作为消息队列进行通信。在实际项目中,我们可以根据需求选择合适的消息队列产品,如Kafka、RocketMQ等。

相关推荐
hxung3 分钟前
MySQL面试学习
学习·mysql·面试
论迹6 分钟前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
愉悦的麻婆豆腐10 分钟前
Neo4j使用neo4j-admin导入csv数据方法
数据库·neo4j
桃子是唯一的水果15 分钟前
java 单例模式(Lazy Initialization)实现遍历文件夹下所有excel文件且返回其运行时间
java·单例模式·maven
+72017 分钟前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
ybq1951334543118 分钟前
javaEE-SpringBoot日志
java·spring boot·后端
火烧屁屁啦22 分钟前
【JavaEE进阶】图书管理系统 - 贰
java·spring
xzzd_jokelin22 分钟前
Spring AI 接入 DeepSeek:开启智能应用的新篇章
java·人工智能·spring·ai·大模型·rag·deepseek
9毫米的幻想27 分钟前
【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
linux·运维·服务器·c语言·c++
刘什么洋啊Zz33 分钟前
剖析IO原理和零拷贝机制
java·运维·网络