前言
我最近读了美团技术团队 (meituan.com)的博客,发现其中的文章涵盖了各种有关技术的话题,对我的学习和职业发展都有很大帮助。因此,我写了一篇总结文章,记录了其中的要点和对工作的启示,希望能为其他技术从业者带来一些灵感和启示。感谢美团技术团队的博客作者提供如此丰富和有价值的资源。
数据脱敏
文章
总结
数据脱敏需要根据具体的业务需求和数据安全等级进行梳理和设计,美团根据自身特有的业务场景和数据安全级别划分(绝密、高保密、保密、可公开),主要从“高保密”等级的敏感数据开始进行梳理,并确定了四种基本类型的脱敏方案。
针对数据脱敏,需要遵循两个原则:
- 保留数据有意义的信息
- 防止黑客进行破解
常用的方法有:
- 替换
- 重排
- 加密
- 截断
- 掩码
- 日期偏移取整
扩展
具体的实现方案有:
- 整合Mybatis插件,在查询的时候针对特定的字段进行脱敏
- 整合Jackson,在序列化阶段对特定字段进行脱敏
- 基于Sharding Sphere实现数据脱敏
- 使用正则表达式或字符串替换等方式对数据进行处理
- 使用加密算法或哈希函数等方式对数据进行转换
关键词提示
文章
总结
这篇文章介绍了基于solrcloud实现的商家搜索关键字智能提示的方案,主要包括以下几个方面:
- 关键字收集:通过日志文件记录用户每次检索使用的所有检索串,并统计出每个关键字的频率。
- 汉字转拼音:使用pinyin4j组件把汉字转换成拼音,并提取出拼音缩写,支持多音字全排列。
- Trie树 + TopK算法:使用Trie树存储大量字符串,根据前缀匹配查询候选词,并使用hashmap统计和堆排序找出TopK热门词。
- 方案优化:使用分布式缓存和异步更新机制提高系统性能和可用性。
MySQL慢查询优化
文章
内容
这篇文章是从开发工程师的角度来介绍数据库索引的原理和如何优化慢查询的。文章主要包括以下几个方面:
- 建立合适的索引,利用最左前缀匹配原则,避免全表扫描。
- 优化查询语句,减少不必要的条件和连接,使用预编译语句,避免排序和分组操作。
- 调整数据库参数,根据数据量和访问频率设置合理的缓存大小和过期时间。
- 分析慢查询日志,定位问题点,使用explain命令查看执行计划。
MySQL中的事务与锁
文章
内容
本文主要介绍了MySQL中InnoDB引擎的事务隔离级别和加锁机制,以及如何避免或解决不可重复读和幻读的问题。以下是一些要点和总结:
- 事务的四种隔离级别分别是未提交读、已提交读、可重复读和串行化,它们对应不同的并发问题和性能开销。
- InnoDB默认使用可重复读作为隔离级别,它可以通过多版本并发控制(MVCC)来保证同一个事务内多次读取同一个数据时看到的是一致的。
- 不可重复读是指在同一个事务内,多次查询某个数据返回的结果不一致,通常是因为其他事务修改了该数据。不可重复读可以通过行锁来避免,即在第一次读取数据后就加上共享锁,阻止其他事务对该数据进行修改。
- 幻读是指在同一个事务内,两次查询返回的结果集不一致,通常是因为其他事务插入或删除了部分数据。幻读无法通过行锁来避免,因为行锁只能锁住已经存在的数据,而不能阻止新数据的插入。幻读可以通过间隙锁(gap lock)或表锁来避免,即在第一次查询时就加上间隙锁或表锁,阻止其他事务对该范围或表进行插入或删除操作。
- 间隙锁是指对记录之间的空隙加上锁定,而不包括记录本身。例如,在索引上对(10,20)之间的空隙加上间隙锁,则可以防止其他事务在这个范围内插入新记录。
- 表锁是指对整张表加上锁定,它会影响所有对该表的操作。例如,在没有索引的情况下执行where条件查询时,就会给整张表加上表锁。
以下是一些相关的解决方案或经验:
- 在设计数据库时尽量给常用字段添加索引,以提高查询效率和减少全表扫描和全表锁定。
- 在编写SQL语句时尽量使用主键或唯一键作为条件,以减少扫描范围和加锁范围。
- 在执行长时间运行的事务时尽量避免修改大量数据或频繁访问热点数据,以减少死锁和超时的风险。
- 在选择合适的隔离级别时要根据业务需求和性能考虑权衡,并且尽量使用session级别而不是全局级别来设置隔离级别。
性能优化模式
文章
内容
本文主要是为了解决由以下三种情况所造成的性能问题:1. 日益增长的用户数量,2. 日渐复杂的业务,3. 急剧膨胀的数据。针对这些问题,提供了一些优化方案和思路
设计原则:
- 最小可用原则
- 经济原则
- 代码复用原则
- 奥卡姆剃刀原则
性能恶化模式:
- 长请求阻塞反模式
- 多次请求杠杆反模式
- 反复缓存反模式
性能优化模式:
- 水平分割模式
- 垂直分割模式
- 恒变分离模式
- 数据局部性模式
- 避免蚊子大炮模式
- 实施离线分离模式
- 降级模式
缓存的应用
文章
内容
- 服务过载是外部请求对系统的访问量突然激增,造成请求堆积,服务不可用,最终导致系统崩溃。
- 缓存在现代系统中使用广泛,但也可能引发服务过载的隐患,例如缓存故障、缓存击穿、缓存雪崩等。
- 缓存模式分为基于超时和基于刷新两种,超时模式是指缓存中的数据在到达一定时间后失效,刷新模式是指缓存中的数据在到达一定时间后触发更新操作。
- 刷新方式分为同步和异步两种,同步刷新是指获取缓存数据的线程等待更新操作完成后返回,异步刷新是指获取缓存数据的线程直接返回旧数据,由另一个线程执行更新操作。
- 预防和恢复服务过载的技术手段包括优化缓存命中率、限流、降级、熔断等。
Java锁
文章
内容
本文介绍了Java中不同类型和特性的锁,以及它们的使用场景和实现原理。
乐观锁与悲观锁
- 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据时判断之前有没有别的线程更新了这个数据。
- 悲观锁认为自己在使用数据时一定有别的线程来修改数据,所以在获取数据时会先加锁,确保数据不会被别的线程修改。
- 乐观锁适合读操作多的场景,悲观锁适合写操作多的场景。
CAS算法
- CAS(Compare And Swap)算法是实现乐观锁最常用的方式。
- CAS需要提供三个值:内存值V、旧值A、新值B。当且仅当内存值V等于旧值A时,才将内存值更新为新值B。
- CAS通过CPU指令保证原子性和可见性。
- CAS可能存在ABA问题和自旋开销问题。
自旋锁
- 自旋锁是一种让线程在获取不到锁时不立即阻塞,而是进行一定次数或时间的循环尝试。
- 自旋锁可以减少线程切换带来的开销,提高性能。
- JDK 6中引入了自适应自旋锁(Adaptive Spinning),根据前一次在同一个锁上自旋时间及持有者状态来决定是否进行自旋。
synchronized关键字
- synchronized是Java中最基本和常用的悲观锁机制。
- synchronized可以修饰代码块或方法,保证同一时间只有一个线程执行该段代码。
- synchronized依赖于Java对象头中Mark Word里存储的状态位信息来实现加解锁操作。
日志记录
文章
内容
- 介绍了业务追踪的概念和需求,以及传统的ELK方案和分布式会话跟踪方案的局限性。
- 提出了一种可视化全链路日志追踪的新方案,通过定义业务逻辑链路,将业务执行的日志以业务链路为载体进行高效组织和串联,并支持业务执行现场的还原和可视化查看。
- 介绍了新方案在大众点评内容平台的落地情况,包括技术架构、实现方式、使用效果等。
分库分表
文章
内容
- 如何根据业务需求和数据量选择合适的分库分表方案和规则,以提高数据库性能和可扩展性。
- 如何利用一致性哈希算法实现数据的均匀分布和动态扩容。
- 如何设计订单号生成的方案,以满足唯一性、自带分库规则、易于查询等要求。
- 如何使用PUMA同步不同维度的订单数据,以支持多角色的查询需求。
- 如何避免复杂查询和join操作,以减少数据库压力和保证数据一致性。
Java NIO解析
文章
内容
这篇文章主要介绍了NIO(Non-blocking I/O)模型的原理和优势,以及如何使用Java的API实现NIO的服务端和客户端程序。对于你的项目,如果你需要处理高并发和大量连接的I/O问题,那么NIO模型可能会给你带来一些启发。你可以参考以下几点:
- NIO模型是一种同步非阻塞的I/O模型,也是I/O多路复用的基础。它可以让一个线程管理多个连接的状态,而不需要为每个连接创建一个线程。
- NIO模型利用事件驱动的方式处理I/O,当一个连接就绪时才进行读写操作,避免了无效的等待和阻塞。
- NIO模型可以提高系统的性能和资源利用率,但也有一些陷阱和难点,比如缓冲区管理、编码解码、异常处理等。
- 使用NIO做网络编程并不容易,推荐使用成熟的NIO框架,如Netty,MINA等。它们解决了很多NIO的陷阱,并屏蔽了操作系统的差异,有较好的性能和编程模型。
服务容错
文章
内容
这篇文章主要介绍了服务容错的基本原则和一些常用的模式,如超时模式、重试模式、限流模式、令牌桶算法等,以及在美团点评的工程实践中的应用。对于你的项目,如果你需要设计一个分布式服务调用的系统,那么这篇文章可能会给你一些启发和指导,让你能够避免一些常见的问题,提高系统在故障发生时的存活能力。你可以参考文章中提到的一些模式和工具,根据自己的业务场景和需求选择合适的方案。
分布式队列编程
文章
内容
这篇文章是关于分布式队列编程模型的介绍和应用,它可能对你的项目有以下几方面的启发:
- 你可以了解什么是分布式队列编程模型,它包含三类角色:发送者、分布式队列和接收者,以及它们之间的交互方式。
- 你可以学习如何根据实际需求进行分布式队列编程建模,考虑通讯的同步性、异步性、单向性、双向性等因素。
- 你可以参考一些实际的分布式队列编程案例,如工单创建、数据同步、流式计算等,看看它们是如何利用分布式队列架构来解决问题的。
- 你可以比较分布式队列编程模型和其他通讯模型,如RPC、RESTful、Ajax等,以及它们各自的优缺点。
架构演变
文章
内容
这篇文章介绍了美团外卖订单系统的演进过程,从早期的单应用架构到现在的分布式可扩展架构,以及在每个阶段遇到的业务特征、挑战和解决方案。如果你的项目也涉及外卖或O2O领域,这篇文章可能会对你有一些启发,比如:
- 如何根据业务需求和规模选择合适的架构模式,比如单应用、微服务、异步化等。
- 如何利用分布式事务、消息队列、缓存等技术来保证系统的高性能、高可用、高稳定。
- 如何进行系统拆分、重构和优化,以应对业务变化和增长。
这些启发都是基于文章中提到的美团外卖订单系统的实践经验。
消息队列设计
文章
内容
这篇文章讨论了消息队列的设计要点及其用例。它探讨了设计消息队列时需要考虑的重要方面,并参考了许多成熟消息队列的重要想法。文章首先解释了什么时候你需要一个消息队列,然后从零开始分析设计一个消息队列时需要考虑到的问题,如RPC、高可用性、顺序和重复消息、可靠投递、消费关系解析等。它还分析了以Kafka为代表的pull模型所具备的优点。最后是一些高级主题,如用批量/异步提高性能、pull模型的系统设计理念、存储子系统的设计等。
如果您正在设计或实现一个消息队列,或者您想更多地了解消息队列如何工作及其用例,那么这篇文章可能会为您的项目提供灵感。