一、微服务改造,本质是业务问题驱动的技术决策 “微服务改造其实是个业务问题”,意思是: 微服务的引入不是为了炫技,而是为了解决业务发展过程中出现的问题。 二、如何理解:从三个维度入手 1. 业务驱动架构演进:不是为了“技术时髦” 微服务不是“为了用微服务而微服务”。 它的本质动因往往是: 业务复杂度增加(多个团队并行开发,多业务线拓展) 部署上线要求变高(某个业务需要独立发布、灰度...
实现一个简单的MCP Server
安装 uv && 初始化项目 pip install uv==0.5.24 uv init mcp_demo1 安装依赖 FastMCP cd mcp_demo1 uv add "mcp[cli]" mcp_server 代码实现,使用标准输出 # server.py from mcp.server.fastmcp import FastMCP # 创建一个...
Thread-Per-Message 模式、Worker Thread 模式、生产者-消费者模式
Thread-Per-Message 模式、Worker Thread 模式、生产者-消费者模式 是多线程中最基础且实用的分工设计模式,它们在任务分离、资源复用、吞吐优化方面各有优势。 一、Thread-Per-Message 模式(每个请求一个线程) 解释: 每个外部请求(如一个 socket 连接)由一个独立线程来处理。常见于早期 HTTP、TCP 服务实现中。 特点: ...
Reactor 和 Proactor 这两个高性能网络模式
演进 如果要让服务器服务多个客户端,那么最直接的方式就是为每一条连接创建线程。 其实创建进程也是可以的,原理是一样的,进程和线程的区别在于线程比较轻量级些,线程的创建和线程间切换的成本要小些,为了描述简述,后面都以线程为例。 处理完业务逻辑后,随着连接关闭后线程也同样要销毁了,但是这样不停地创建和销毁线程,不仅会带来性能开销,也会造成浪费资源,而且如果要连接几万条连接,创建几万个线程去应...
并发编程:无锁方案 CAS
在并发编程中,“无锁方案”是指不使用传统的互斥锁(如 synchronized、ReentrantLock)来实现线程安全,而是依赖 CAS(Compare-And-Swap)、原子变量、volatile、内存屏障等机制,达到无阻塞(Non-blocking)或最小阻塞的高性能并发效果。 一、无锁方案的设计思想 基于 CAS 操作的原子更新: CAS 保证变...
并发编程:起源
并发编程是计算机科学中的一个重要领域,尤其在多核 CPU 广泛使用、任务响应要求更高的今天,越来越成为开发者必须掌握的能力。 一、并发编程的历史来源 背景演进: 单核时代(1950s-1980s): 初期计算机处理速度慢,CPU资源非常宝贵。 为了提高CPU利用率,引入了多任务调度(如批处理系统、时分多道程序设计)。 ...
并发编程:单核计算机如何通过交替执行实现并发
任务A 与任务B 在单核 CPU 上交替运行 时间线 → ┌────────────────────────────────────────────────────────────┐ │ 单核CPU执行流程(通过时间片调度) │ ├────────────┬────────────┬────────────┬────────────┬─...
并发编程:可重入锁、不可重入锁、公平锁、非公平锁
并发编程:可重入锁、不可重入锁、公平锁、非公平锁 一、可重入锁(Reentrant Lock) 概念 同一个线程在外层方法获取锁之后,在进入该锁保护的内层方法时,可以再次获得锁,不会被自己阻塞。 特点: 锁维护一个持有线程的引用和重入计数器 每 lock() 一次,计数 +1,unlock() 一次,计数 -1 Java 示例 public class Reen...
并发编程:为什么并发编程容易出问题
在 Java 并发编程 中,容易出问题的根本原因主要来源于 Java 的内存模型(JMM)、线程调度机制、锁机制 Java 并发编程容易出问题的根本原因 1. Java 内存模型(JMM)导致的“可见性问题” 原因: Java 中每个线程有自己的工作内存(缓存),和主内存之间同步是延迟的。 一个线程修改变量后,另一个线程可能看不到最新值。 解决方式: 使...