分布式架构-架构演进概述
参考凤凰架构: 演进的架构一大章节 演进中的架构 计算机总是务实, 某一架构的出现和兴盛往往都是在承载着某个历史使命, 衰败则是因为使命的消失或者有了更好的方案. 所以想要知道某个架构的历史使命, 我们不得不向过去看, 了解到它到底是解决了之前无法解决的什么问题, 也要向现在看它为什么能兴盛, 最后向未来看它为什么衰败, 如此才能理解这个架构的历史和使命 @fung 原始分布式时代令人惊讶的是, 使用多个独立的分布式服务共同构建一个大型系统的设想和尝试, 反而是比今天的大型单体系统出现的时间更早 在20世纪70年代末期到80年代初, 计算机硬件的运算能力的局促, 直接妨碍到了在单台计算机上信息系统软件能够达到的最大规模. 于是计算机科学家们开始探索一种多台计算机共同协作来支撑一套软件系统, 这就是原始分布式时代 负责制定 UNIX 系统技术标准的“开放软件基金会”(Open Software Foundation,OSF,也即后来的“国际开放标准组织”)邀请了当时业界主流的计算机厂商一起参与,共同制订了名为“分布式运算环境”(Distributed Computing En...
JUC-线程池-ThreadPoolExecutor类详解
线程池-ThreadPoolExecutor类详解ThreadPoolExecutor的构造方法12345678public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler);} corePoolSize: 核心线程数, 线程池中即使没有任务也要保持存活的最大线程数量 ...
JUC-原子类-AtomicInteger类详解
原子类-AtomicInteger类详解说实话, 也没什么好额外讲的, 整个原子类家族, 就是一族封装了一些类CAS操作的类, 提供了我们为某个变量进行原子操作的能力, 让我们可以在多线程环境下, 对某个变量进行原子操作, 而不需要加锁. 下面简单说明一下类的结构 核心字段12345private static final Unsafe U = Unsafe.getUnsafe();private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");private volatile int value; Unsafe就是提供了操作系统层面的API来执行CAS操作类 VALUE是使用了Unsafe获取到的AtomicInteger类中的value字段的属性在类中偏移量, 用于CAS操作 value就是我们这个Integer类的值, 这里的value是保证可见性的, 所以如果使用Atomic是默认保证多线程之间的可见性, 不需要额外加volatile 核...
MySQL Buffer
Buffer Pool就像CPU Cache一样的缓存中间层, 来提高MySQL的性能, 写方面采用写回策略(修改的时候如果在缓存中, 就会直接修改缓存中的数据, 然后标记为脏页) Buffer Pool缓存了什么在MySQL启动的时候, 会为Buffer Pool分配一片连续的内存空间, 然后按照默认的16KB的大小分页, Buffer Pool中的页就是缓存页 Buffer Pool中缓存了这六种信息 undo页记录的是什么 生成undo log的时候, undo log会写入到Buffer Pool中的Undo 页面 查询一条记录, 就只会缓冲一条记录吗 会将整个页都缓存进去
MySQL 日志
MySQL日志 参考文章: 小林coding-MySQL 日志 执行一条update语句, 期间会发生什么 1UPDATE t_user SET name = 'xiaolin' WHERE id = 1; 首先是前面和查询语句相似的流程 客户端先通过连接器建立连接, 连接器判断用户的身份 查询缓存, 但是因为这是一条update语句, 所以不会走查询缓存的步骤, 相反会将对应的表的缓存给清空 通过解析器分析update语句, 拿到update关键字, 表名等信息, 构建出来语法树, 做语法检查 通过预处理器判断表和字段是否存在 优化器确定执行计划, 这里因为是通过id作为where的条件, 会通过id这个主键执行查询 将执行计划交给存储引擎执行, 找到这一行, 然后执行更新 而日志就在最后的更新步骤出现了 undo log: Innodb引擎层生成的日志, 实现了事务的原子性, 主要实现了事务回滚和MVCC redo log: Innodb引擎层生成的日志, 实现了事务的持久性, 主要实现了crush-safe binlog: Server层生...
AI-Agent 工作流-Evaluator-optimizer
工作流-评估优化器流程说明在评估-优化器中, 一个LLM调用生成响应, 另一个在循环中提供评估和反馈 用户输入task LLM生成第一轮的回复 对LLM的回复生成评估 检查评估的结果是不是PASS, 如果是, 直接返回最终结果 将所有的历史memory都添加到上下文中, 以及将回复评估添加到上下文中 进行下一次循环 代码 loop 12345678910111213141516171819202122232425private RefinedResponse loop(String task, String context, List<String> memory, List<Generation> chainOfThought) { Generation generation = generate(task, context); memory.add(generation.response()); chainOfThought.add(generation); ...
AI-Agent 工作流-Orchestrator-workers
工作流-编排器-工人工作流流程说明这个工作流可以看作是ParallelizationWorkflow的自动分配任务版本 中央LLM动态分解任务, 并将其委派给工作者LLM, 并综合结果 用户输入任务描述input 将用户的任务和编排器prompt输入给LLM用于划分任务 将划分后的任务集合和工人prompt输入给LLM用于执行划分后的任务 返回所有的执行结果 代码 执行代码, process 1234567891011121314151617181920public FinalResponse process(String taskDescription) { // 获取编排器的编排结果 OrchestratorResponse orchestratorResponse = this.chatClient.prompt() .user(u -> u.text(this.orchestratorPrompt)) .param("task", taskDescription) .ca...
AI-Agent 工作流-Parallelization Workflow
工作流-并行工作流流程说明 用户输入input数组对应需要并行执行一系列任务, 适用于所有的任务的prompt, 以及线程池的数量 将每个input并行化运行LLM 等待所有的运行完毕后返回 代码123456789101112131415161718192021222324public List<String> parallel(String prompt, List<String> inputs, int nWorks) { ExecutorService executor = Executors.newFixedThreadPool(nWorkers); try { List<CompletableFuture<String>> futures = input.stream() .map(input -> CompletableFuture.supplyAsync(() 0> { try{ ...
AI-Agent 工作流-Routing Workflow
工作流-路由工作流流程说明用户输入userInput和可行的路由Map<String, Object> String是对这个路由的简介, Object就是实际的路由内容 这里以角色分配, 将不同的任务分配给不同的promt角色的使用方式举例 用户输入初始的userInput和Map<String, String> 根据userInput和Map的keySet让LLM决策当前任务使用的prompt角色, 给出原因和选择, 使用结构化的输出到RoutingResponse中 使用对应的prompt角色, 输出最后的结果 代码 route方法 1234567891011121314public String route(String userInput, Map<String, Object> routes, String mode) { RoutingResponse routingResponse = determineRoute(input, routes.keySet); Object select = ...
AI-Agent 工作流-Chain Workflow
工作流-lian’shi 参考 https://www.anthropic.com/engineering/building-effective-agents 流程说明对于链式工作流, 整体的呈现效果就是用户输入userInput以后, 这个userInput在输入以后会链式的向下执行, 在每个节点携带上一个节点的回答和使用当前节点的prompt来和LLM对话 填充systemPrompts数组, 在这种情况下, Chain Workflow也被称作Prompts Chain工作流 遍历每个prompt 将上一轮的回答和现在的prompt组成一个新的input 对话获取response 输出最后的response 代码 代码 123456789101112131415public String chain(String userInput) { String response = usertInput; for (String promt : systemPrompts) { String input = S...