运维锅总详解系统设计原则
本文对CAP、BASE、ACID、SOLID 原则、12-Factor 应用方法论等12种系统设计原则进行分析举例,希望对您在进行系统设计、理解系统运行背后遵循的原理有所帮助!
一、CAP、BASE、ACID简介
以下是 ACID、CAP 和 BASE 系统设计原则的详细说明及其应用举例:
ACID 原则
ACID 原则主要用于传统关系型数据库,确保事务的可靠性和一致性。
-
Atomicity(原子性):事务中的所有操作要么全部完成,要么全部不完成。
- 例子:在银行转账系统中,从账户 A 转账到账户 B 是一个事务。如果扣款操作成功而存款操作失败,整个事务将回滚,确保 A 和 B 的余额不会发生不一致的变化。
-
Consistency(一致性):事务完成后,数据库必须从一个一致性状态转换到另一个一致性状态。
- 例子:在订单管理系统中,创建订单的同时减少库存。如果库存不足,整个事务将失败,订单不会被创建。
-
Isolation(隔离性):并发事务彼此独立执行,一个事务的中间状态对其他事务不可见。
- 例子:在在线购物系统中,多个用户同时购买同一商品,每个事务隔离执行,确保每个用户都看到正确的库存数量。
-
Durability(持久性):一旦事务提交,数据将永久保存,即使系统崩溃也不会丢失。
- 例子:在在线支付系统中,支付成功后,交易记录会永久保存,即使系统在支付后立即崩溃,支付记录也不会丢失。
CAP 定理
CAP 定理描述了分布式系统中一致性、可用性和分区容忍性三者之间的权衡,指出在网络分区的情况下,一个系统只能保证一致性和可用性中的两个。
-
Consistency(一致性):所有节点在同一时间看到相同的数据。
- 例子:分布式数据库 MongoDB 默认配置下,要求所有读操作都能看到最新的写操作,确保一致性。
-
Availability(可用性):每个请求都能收到非错误响应,但不保证数据一致。
- 例子:DNS 系统,即使某些服务器不可用,用户仍能获取域名解析结果。
-
Partition Tolerance(分区容忍性):系统在网络分区的情况下仍能继续运行。
- 例子:Cassandra 数据库通过分布式架构和副本机制确保在网络分区时仍能读写数据。
BASE 原则
BASE 是一种设计原则,用于处理大规模分布式系统中的数据一致性问题,相对于 ACID 强调最终一致性和高可用性。
-
Basically Available(基本可用):系统在大部分时间是可用的,但可能存在部分数据不可用或响应时间延迟的情况。
- 例子:在电商大促销活动期间,购物车服务可能会延迟但仍能正常使用,确保用户基本可用的体验。
-
Soft state(软状态):系统状态允许存在暂时的不一致,经过一定时间后会达到最终一致。
- 例子:社交媒体平台的用户点赞数据在不同服务器之间可能有延迟,但最终会同步一致。
-
Eventual consistency(最终一致性):系统保证在没有新的更新操作后,经过一段时间,所有数据副本最终会达到一致。
- 例子:Amazon DynamoDB 在分布式环境中,写操作会传播到所有副本,最终确保所有节点的数据一致。
这些原则和应用举例展示了不同系统设计原则在实际应用中的具体实现方式,帮助理解如何在不同场景中应用这些原则来构建可靠的分布式系统。
二、BASE、CAP 、ACID之间的异同
BASE、CAP 和 ACID 是分布式系统和数据库设计中的三个重要概念,每个概念都涉及数据一致性、可用性和系统性能的权衡。理解它们之间的异同对于设计和选择合适的系统架构非常重要。
ACID
ACID 是传统关系数据库管理系统(RDBMS)中事务处理的四个关键属性:
- Atomicity(原子性):事务是不可分割的操作单元,要么全部执行,要么全部不执行。
- Consistency(一致性):事务执行前后,数据库都处于一致的状态。
- Isolation(隔离性):并发事务的执行不互相影响,每个事务的中间状态对其他事务是不可见的。
- Durability(持久性):事务一旦提交,其结果就会永久保存在数据库中,即使系统发生故障。
CAP 定理
CAP 定理是 Eric Brewer 提出的关于分布式系统的一个重要理论,指出分布式系统在网络分区情况下,不能同时保证以下三个特性:
- Consistency(一致性):每次读取都能返回最近写入的结果。
- Availability(可用性):每次请求都能在合理时间内返回响应。
- Partition Tolerance(分区容忍性):系统在出现网络分区的情况下仍能继续运行。
CAP 定理强调了分布式系统设计中一致性、可用性和分区容错性之间的权衡。在实际系统中,只能同时满足其中的两个特性。
BASE
BASE 是一种设计原则,用于设计分布式系统,以牺牲强一致性来获得更高的可用性和性能。BASE 的主要属性包括:
- Basically Available(基本可用):系统保证基本的可用性,允许在部分故障的情况下仍能提供服务。
- Soft state(软状态):系统的状态可以在不一致的情况下存在一段时间,允许暂时的状态不一致。
- Eventual consistency(最终一致性):系统在没有新的更新操作后,最终会达到一致状态。
三者的异同
异同点总结
-
一致性要求
- ACID:强一致性,确保每次读操作都能返回最新的写操作结果。
- CAP:强调在一致性、可用性和分区容忍性之间做权衡,不能同时满足三者。
- BASE:允许暂时的不一致,最终达到一致性,以提高系统的可用性和性能。
-
可用性
- ACID:优先保证数据的一致性,可能会影响可用性。
- CAP:系统设计时需要在可用性和一致性之间做出选择,不能同时完全保证两者。
- BASE:优先保证系统的可用性,允许在短时间内数据不一致。
-
系统模型
- ACID:适用于传统关系数据库系统,事务处理严格,适用于对数据一致性要求高的场景。
- CAP:适用于分布式系统,帮助理解系统在一致性、可用性和分区容忍性之间的权衡。
- BASE:适用于分布式数据库系统,注重系统的可用性和性能,适用于对一致性要求较低但需要高可用性的场景。
详细对比
-
ACID vs. BASE
- 一致性:ACID 强调强一致性,BASE 强调最终一致性。
- 可用性:ACID 可能会牺牲部分可用性以保证一致性,BASE 保证高可用性。
- 适用场景:ACID 适用于金融系统等对一致性要求高的场景,BASE 适用于社交网络、电子商务等对可用性和性能要求高的场景。
-
CAP vs. ACID
- 一致性:ACID 只关注强一致性,CAP 需要在一致性和可用性之间做出权衡。
- 系统设计:ACID 强调单节点事务的一致性,CAP 强调分布式系统的一致性、可用性和分区容忍性之间的平衡。
- 适用场景:ACID 适用于集中式数据库系统,CAP 适用于分布式系统。
-
CAP vs. BASE
- 一致性和可用性:CAP 定理指出分布式系统在网络分区下不能同时满足一致性和可用性,BASE 选择在保证可用性的同时允许最终一致性。
- 系统容忍性:CAP 强调分区容忍性,BASE 通过软状态和最终一致性来实现系统的分区容忍性。
- 适用场景:CAP 定理适用于所有分布式系统的设计原则,BASE 主要适用于需要高可用性和可扩展性的分布式数据库系统。
总结来说,ACID、CAP 和 BASE 是在不同背景和需求下提出的系统设计原则。ACID 强调数据的一致性和事务的可靠性,CAP 强调分布式系统中的权衡和限制,而 BASE 则在分布式系统中牺牲一致性以换取更高的可用性和性能。理解这些原则有助于在设计和选择分布式系统时做出合适的决策。
三、其他重要的设计原则和模式
在系统设计中,除了 ACID、CAP 和 BASE 之外,还有许多其他重要的原则和模式,它们各自针对不同的背景和需求。这些原则和模式帮助设计者构建可靠、可扩展、高效和维护性强的系统。以下是一些关键的系统设计原则和模式:
1. SOLID 原则
SOLID 是面向对象设计的五个原则,旨在提高代码的灵活性和可维护性。
-
Single Responsibility Principle(单一职责原则):每个类应该只有一个引起变化的原因。
- 例子:在一个图书馆管理系统中,将图书借阅处理逻辑与用户管理逻辑分开,使每个类专注于一个职责。
-
Open/Closed Principle(开闭原则):软件实体应当对扩展开放,对修改关闭。
- 例子:在电商系统中,通过插件机制添加新支付方式,而不修改原有支付处理代码。
-
Liskov Substitution Principle(里氏替换原则):子类对象可以替换父类对象而不影响程序的正确性。
- 例子:在一个绘图程序中,圆形类和椭圆形类都继承自图形类,它们可以替换图形类的实例而不会影响绘图逻辑。
-
Interface Segregation Principle(接口隔离原则):客户端不应依赖它们不使用的接口。
- 例子:为打印机和扫描仪创建不同的接口,而不是一个包含所有功能的大接口。
-
Dependency Inversion Principle(依赖倒置原则):高层模块不应依赖低层模块,两者都应依赖于抽象。
- 例子:在一个电商系统中,高层的订单处理逻辑依赖于一个订单接口,而不是具体的订单实现类。
2. 12-Factor 应用方法论
12-Factor 方法论是构建云原生应用的最佳实践,强调应用的可移植性和可扩展性。
-
代码库:一个代码库管理多环境部署。
- 例子:使用 Git 来管理应用代码,并使用不同的分支来处理开发、测试和生产环境的部署。
-
依赖:显式声明和隔离依赖。
- 例子:使用
package.json
文件来管理 Node.js 应用的所有依赖,确保应用可以在不同环境中正确运行。
- 例子:使用
-
配置:在环境中存储配置。
- 例子:通过环境变量配置数据库连接信息,而不是硬编码在应用代码中。
-
后端服务:将后端服务作为附加资源。
- 例子:将数据库、消息队列和缓存等后端服务作为独立资源来访问,而不是内置在应用中。
-
构建、发布、运行:严格分离构建和运行阶段。
- 例子:使用 CI/CD 管道来自动化构建和部署过程,从而保持构建和运行环境的一致性。
-
进程:应用程序是一组无状态进程。
- 例子:设计微服务应用时,每个服务都是无状态的,可以在不同的服务器上运行。
-
端口绑定:通过端口绑定提供服务。
- 例子:一个 Web 应用在 Docker 容器中运行,绑定到容器的端口上以提供 HTTP 服务。
-
并发:通过进程模型实现扩展。
- 例子:使用多线程或多进程模型来处理高并发请求,提高系统的处理能力。
-
易处理性:快速启动和优雅终止。
- 例子:应用程序能够快速启动并正确处理终止信号,以保证数据的安全性和完整性。
-
开发/生产环境等价性:尽可能在开发、测试和生产中保持环境一致。
- 例子:使用 Docker 容器来确保开发和生产环境的一致性,从而减少环境差异带来的问题。
-
日志:将日志作为事件流。
- 例子:应用程序将日志信息输出到标准输出,并使用集中式日志管理工具(如 ELK Stack)进行收集和分析。
-
管理任务:管理任务的一次性进程。
- 例子:使用独立的命令行工具进行数据库迁移,而不是将其嵌入到应用程序的运行逻辑中。
3. CQRS(Command Query Responsibility Segregation)
CQRS 是一种将读操作和写操作分离的设计模式,以提高系统性能和扩展性。
-
读写分离:将读取和写入操作分离到不同的模型中。
- 例子:在一个在线商店中,使用一个模型处理订单的创建和更新,另一个模型处理订单的查询,从而优化读写操作。
-
命令模型:处理写操作,确保数据一致性。
- 例子:订单创建时,使用命令模型进行订单处理,并更新库存状态。
-
查询模型:处理读操作,优化查询性能。
- 例子:订单查询时,使用专门的查询模型来提高检索速度,并优化查询性能。
4. 事件溯源(Event Sourcing)
事件溯源是一种将状态变化记录为事件的模式,通过重放事件来重建系统的状态。
-
事件存储:将状态变化记录为事件,并存储这些事件。
- 例子:在一个股票交易系统中,每笔交易都记录为一个事件,通过重放所有事件来重建交易历史。
-
状态重建:通过重放事件来重建系统的当前状态。
- 例子:通过重放所有账户交易事件来计算当前账户余额。
-
审计跟踪:提供详细的审计跟踪,记录所有状态变化。
- 例子:记录所有用户登录和操作事件,以便于事后审计和跟踪。
5. 微服务架构
微服务架构将应用程序拆分为一组小的、自治的服务,每个服务可以独立部署和扩展。
-
服务拆分:将应用程序功能拆分成独立的服务。
- 例子:在一个电商平台中,拆分出用户服务、订单服务、支付服务等,每个服务负责特定的业务功能。
-
独立部署:每个服务可以独立部署和升级。
- 例子:独立部署支付服务和订单服务,升级支付服务时不会影响订单服务的运行。
-
技术异构:不同服务可以使用不同的技术栈。
- 例子:用户服务使用 Node.js 实现,订单服务使用 Java 实现,两者通过 API 进行通信。
-
松耦合:服务之间通过轻量级通信协议进行交互。
- 例子:使用 HTTP REST API 或消息队列(如 Kafka)来实现服务间的通信。
6. 服务网格(Service Mesh)
服务网格是一种用于处理微服务架构中服务间通信的基础设施层。
-
流量管理:控制服务间的流量和路由。
- 例子:使用 Istio 来管理服务间的流量路由和负载均衡。
-
服务发现:自动检测和发现新服务实例。
- 例子:服务网格自动发现新部署的服务实例,并将流量路由到这些实例。
-
安全性:提供服务间通信的安全性,如加密和认证。
- 例子:使用服务网格提供服务间的 TLS 加密和双向认证。
-
可观察性:提供服务间通信的可见性和监控。
- 例子:使用服务网格收集服务间的通信数据,并进行监控和分析。
7. API 设计原则
设计良好的 API 应该是易于使用、清晰一致、版本控制和文档完备。
-
RESTful API:基于资源的架构风格,使用标准 HTTP 方法(GET、POST、PUT、DELETE)操作资源。
- 例子:一个图书馆系统的 API 提供获取图书信息的 GET 请求、添加图书的 POST 请求等。
-
GraphQL:一种用于 API 的查询语言,允许客户端指定所需数据结构。
- 例子:在社交媒体平台中,客户端可以通过 GraphQL 查询获取用户信息和用户帖子,同时只返回需要的数据。
8. 事件驱动架构(Event-Driven Architecture, EDA)
事件驱动架构通过事件来触发和通信系统的不同部分,提高系统的松耦合性和扩展性。
-
事件发布和订阅:系统中的组件通过发布和订阅事件来进行通信。
- 例子:在一个电商平台中,订单创建事件可以触发库存更新、邮件通知等多个事件处理过程。
-
异步处理:使用消息
9. 设计模式
设计模式是面向对象软件设计中的可复用解决方案,包括以下三类:
- 创建型模式:如单例模式、工厂模式、建造者模式等,旨在创建对象时提供灵活性和复用性。
- 结构型模式:如适配器模式、装饰器模式、代理模式等,旨在处理类和对象的组合关系。
- 行为型模式:如观察者模式、策略模式、命令模式等,旨在类和对象间的职责划分和行为协作。
完。
希望对您有所帮助!关注锅总,及时获得更多花里胡哨的运维实用操作!
四、一个秘密
锅总个人博客
https://gentlewok.blog.csdn.net/
锅总微信公众号
相关文章:

运维锅总详解系统设计原则
本文对CAP、BASE、ACID、SOLID 原则、12-Factor 应用方法论等12种系统设计原则进行分析举例,希望对您在进行系统设计、理解系统运行背后遵循的原理有所帮助! 一、CAP、BASE、ACID简介 以下是 ACID、CAP 和 BASE 系统设计原则的详细说明及其应用举例&am…...

深度学习笔记: 最详尽解释预测系统的分类指标(精确率、召回率和 F1 值)
欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家! 预测系统的分类指标(精确率、召回率和 F1 值) 简介 让我们来谈谈预测系统的分类指标以及对精确率、召回…...

GEE代码实例教程详解:MODIS土地覆盖分类与面积计算
简介 在本篇博客中,我们将使用Google Earth Engine (GEE) 对MODIS土地覆盖数据进行分析。通过MODIS/061/MCD12Q1数据集,我们可以识别不同的土地覆盖类型,并计算每种类型的总面积。 背景知识 MODIS MCD12Q1数据集 MODIS/061/MCD12Q1是NASA…...

LT86101UXE 国产原装 HDMI2.0 / DVI中继器方案 分辨率 4Kx2K 用于多显示器 DVI/HDMI电缆扩展模块
1. 描述 Lontium LT86101UXE HDMI2.0 / DVI中继器特性高速中继器符合HDMI2.0/1.4规范,最大6 gbps高速数据率、自适应均衡RX输入和pre-emphasized TX输出支持长电缆应用程序,没有晶体在船上保存BOM成本,内部灵活的PCB TX巷交换路由。 LT86101UXE HDMI2.0/DVI中继器自动检测线缆损…...

FastApi中的常见请求类型
FastApi中的常见请求类型 后端开发语言中,我钟情于node,高效的异步处理真是让我眼前一亮,同时,简单易懂的语法也让我非常倾心 但是但是,因为考虑要写一个深度学习算法的后端接口,所以不得不选用python作为…...

服务器,云、边缘计算概念简单理解
目录 服务器,云、边缘计算概念简单理解 一、服务器 二、云计算 三、边缘计算 服务器和云之间区别 性质 可用性 弹性扩展 管理和维护 成本 应用场景 服务器,云、边缘计算概念简单理解 一、服务器 概念简单理解: 服务器是计算机网络上最重要的设备之一,它在网络…...

【Linux系列2】Cmake安装记录
方法一 1. 查看当前cmake版本 [rootlocalhost ~]# cmake -version cmake version 2.8.12.22. 进行卸载 [rootlocalhost ~]# yum remove -y cmake3. 进行安装包的下载,也可以下载好安装包后传至相应的目录 [rootlocalhost ~]# mkdir /opt/cmake [rootlocalhost ~…...

C++ STL 多线程库用法介绍
目录 一:Atomic: 二:Thread 1. 创建线程 2. 小心移动(std::move)线程 3. 如何创建带参数的线程 4. 线程参数是引用类型时,要小心谨慎。 5. 获取线程ID 6. jthread 7. 如何在线程中使用中断 stop_token 三:如何…...

Jmeter实现接口自动化
自动化测试理论知识 什么是自动化测试? 让程序或工具代替人为执行测试用例什么样的项目适合做自动化? 1、项目周期长 --多长算长?(自己公司运营项目) 2、需求稳定(更多具体功能/模块) 3、需要…...

【大模型】多模型在大模型中的调度艺术:解锁效率与协同的新境界
多模型在大模型中的调度艺术:解锁效率与协同的新境界 引言一、多模型与大模型的概念解析二、多模型调度的必要性三、多模型调度的关键技术3.1 负载均衡与动态分配3.2 模型间通信与协作3.3 模型选择与优化 四、多模型运行优化策略4.1 异构计算平台的利用4.2 模型压缩…...

LeetCode 704, 290, 200
目录 704. 二分查找题目链接标签思路代码 290. 单词规律题目链接标签思路代码 200. 岛屿数量题目链接标签思路代码 704. 二分查找 题目链接 704. 二分查找 标签 数组 二分查找 思路 这道题是 二分查找 最经典的一道题,掌握了本题的思想就进入了 二分 思想的大…...

如何利用Java进行大数据处理?
如何利用Java进行大数据处理? 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 引言 在当今信息爆炸的时代,处理大数据是许多应用程序和系统的核心需求之一。Java作为一种…...

【论文通读】GUICourse: From General Vision Language Model to Versatile GUI Agent
GUICourse: From General Vision Language Model to Versatile GUI Agent 前言AbstractMotivationSolutionGUICourseGUIEnvGUIEnv-globalGUIEnv-local GUIActGUIAct (web-single)GUIAct (web-multi)GUIAct (smartphone) GUIChat ExperimentsMain ResultAblation Study Conclusi…...

王道考研数据机构:中缀表达式转为后缀表达式
实现方法: 初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右处理各个元素,直到末尾。可能遇到三种情况: 遇到操作数。直接加入后缀表达式遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式&…...

PL/SQL安装+汉化教程
PL/SQL安装教程 一、安装: 登陆官网:PL/SQL Developer - Allround Automations下载 下载PL/SQL稳定版本12.0.7 根据自己计算机版本安装相适配的版本。我这里安装X64-bit版本 进行安装: 根据情况去更改安装,我这里全部下一步…...

Qt | Qt 线程相关类概述和举例
Qt 是一个广泛用于跨平台应用开发的框架。在 Qt 中,多线程支持是其核心特性之一,它允许开发者在不同平台上创建并发应用。以下是 Qt 中与线程相关的类概述及其使用示例。 Qt 中的线程相关类 QThread QThread 是 Qt 中用于创建和管理线程的基类。通过派生并重写 run() 函数…...

Linux 复现Docker NAT网络
Linux 复现Docker NAT网络 docker 网络的构成分为宿主机docker0网桥和为容器创建的veth 对构成。这个默认网络命名空间就是我们登陆后日常使用的命名空间 使用ifconfig命令查看到的就是默认网络命名空间,docker0就是网桥,容器会把docker0当成路由&…...

HBuilder X 小白日记03-用css制作简单的交互动画
:hover选择器,用于选择鼠标指针浮动在上面的元素。 :hover选择器可用于所有元素,不只是链接 :link选择器 设置指向未被访问页面的链接的样式 :visited选择器 用于设置指向已被访问的页面的链接 :active选择器 用于活动链接...

【深度学习练习】心脏病预测
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、什么是RNN RNN与传统神经网络最大的区别在于,每次都会将前一次的输出结果,带到下一隐藏层中一起训练。如下图所示: …...

创建react的脚手架
Create React App 中文文档 (bootcss.com) 网址:creat-react-app.bootcss.com 主流的脚手架:creat-react-app 创建脚手架的方法: 方法一(JS默认): 1. npx create-react-app my-app 2. cd my-app 3. …...

用例导图CMind
突然有一些觉悟,程序猿不能只会吭哧吭哧的低头做事,应该学会怎么去展示自己,怎么去宣传自己,怎么把自己想做的事表述清楚。 于是,这两天一直在整理自己的作品,也为接下来的找工作多做点准备。接下来…...

C++ 仿函数
一、介绍 CSTL中的仿函数,又被称为函数对象,其实就是:重载了()运算符的类。 因为在使用重载的operator()时,类似于函数调用,因此被称为仿函数。 ※注意※:仿函数本质上是一个类,不是函数。 二…...

Redhat 安装 docker 网络连接超时问题
目录 添加阿里云的Docker CE仓库 更新YUM缓存 安装 Docker Engine 启动并设置Docker自启动 验证 Docker 安装 [userlocalhost ~]$ sudo yum-config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo 正在更新 Subscription Management 软件仓库…...

Java面试题:undo log和redo log
undo log和redo log的区别 缓冲池(buffer pool): 主内存中的一个区域,可以缓存磁盘上经常被操作的数据,在执行crud时先操作缓冲池的数据以减少磁盘io 数据页(page): InnoDB存储引擎管理的最小单元,每页大小为16kb,页中存储的是行数据 redo log 重做日志,用来实现任务的持…...

【Scrapy】Scrapy 中间件等级设置规则
准我快乐地重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 再去做没流着情泪的伊人 假装再有从前演过的戏份 重饰演某段美丽故事主人 饰演你旧年共寻梦的恋人 你纵是未明白仍夜深一人 穿起你那无言毛衣当跟你接近 🎵 陈慧娴《傻女》 Scrapy 是…...

SDK环境的安装(测试使用)
1、安装 将文件解压至目录,我的目录为:D:\Program Files\Android 解压后如下: 下载链接如下: sdk下载 提取码见文章最后: 2、配置环境 1、在环境变量中,选择系统变量,点击新建。 变量名:ANDROID_HOME 变量值:“你自己的android-sdk安装路径” (例如我的:D:\Pro…...

【matlab】【python】爬虫实战
目录 引言 具体步骤 1.设置请求选项 2.发送请求并获取响应 3.设置正则表达式 4.执行正则表达式匹配 matlab完整代码 python代码示例 引言 在当今这个信息爆炸的时代,数据已成为推动社会进步和企业发展的核心动力之一。随着互联网的普及和技术的飞速发展&am…...

Android TV跨平台开发心得
这半年来陆陆续续做了一堆poc,刚开始是flutter,结果领导叫停了,说有其他部门做一样的事,真不巧;后来是react native,开发了个demo,上报上去了已经;现在又要做android nativewebview …...

View->裁剪框View的绘制,手势处理
XML文件 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android…...

语言模型的进化:从NLP到LLM的跨越之旅
在人工智能的浩瀚宇宙中,自然语言处理(NLP)一直是一个充满挑战和机遇的领域。随着技术的发展,我们见证了从传统规则到统计机器学习,再到深度学习和预训练模型的演进。如今,我们站在了大型语言模型ÿ…...