同步异步同步:就是实时接收,比如视频聊天
异步:就是延迟接收,比如微信打字
为什么要选择MQ1、便于拓展主业务只需要将消息发送到消息队列中就行,其他业务按照自己的业务消费,比如订单支付成功后,发送消息到消息队列,其他业务:更新订单状态、发送短信、增加积分等等都可以解耦
2、提高性能耗时:主业务+所有附加业务(更新订单状态、发送短信、增加积分等等)-> 主业务+发送消息
3、业务安全如果主业务因为附加业务失败而失败,并不合理,比如用户下单成功,因为短信通知失败而给用户退款吗,有点意思。
利用MQ主业务不会因为受到附加业务的影响,比如短信未发送成功,不会影响用户已下单的状态
各类MQ对比
特性/产品
RabbitMQ
Kafka
RocketMQ
ActiveMQ
Pulsar
开发语言
Erlang
Scala/Java
Java
Java
Java/C++
主要协议
AMQP
自定义协议
自定义协议
JMS, AMQP, STOMP
Pulsar API
吞吐量
万级/秒
十万~百万级/秒
十万级/秒
...
Java内存模型(JMM)详解Java内存模型(JMM) 是一套规范,定义了多线程环境下线程如何访问共享变量的规则,主要解决三大核心问题:可见性、原子性和有序性。
1. 可见性每个线程拥有自己的工作内存(缓存),存储主内存中共享变量的副本。当线程A修改了共享变量后,若不采取特殊措施,线程B可能无法立即看到这个修改,仍使用旧值。
解决方案:
volatile关键字:确保变量的修改立即同步到主内存,并使其他线程中该变量的缓存失效,强制重新从主内存读取最新值
synchronized/ReentrantLock:解锁前会将修改刷新至主内存
final关键字:保证final字段的初始化在构造函数完成后对其他线程可见
2. 原子性复合操作(如i++)包含”读取-修改-写入”三个步骤,多线程环境下可能导致操作交错,使结果不符合预期。
示例:当i=10时,两个线程同时执行i++,理想结果应为12,但实际可能只增加1次变为11,因为:
线程A读取i=10
线程B也读取i=10
线程A将i增加为11并写回
线程B将i增加为11(基于旧值10)并写回
解决方 ...
环境与模型准备首先需要在本地拉取所需的模型文件:
推理模型:拉取 DeepSeek R1 (1.5b版本)
1ollama pull deepseek-r1:1.5b
向量模型:拉取文本嵌入模型
1ollama pull nomic-embed-text
两种响应方式一、非流式响应适用于不需要实时打字机效果的场景,直接返回完整结果。
12345678910public Response<ChatResponse> generate(@RequestParam("model") String model, @RequestParam("message") String message, @RequestParam(value = "knowledgeBase", required = false) String knowledgeBase) { / ...







