我们平时开发时,都会用到一些java中间件或工具,这些组件都或多或少会包含高可用、高性能等特点。下面以mysql、redis、kafka等组件为例,说明他们是如何实现这些特点的,希望这些特点的实现方式,能为我们开发相关组件提供一些思路。
一、高可用
1、mysql:
1)集群模式:一台机器存在单点问题,那就多个机器组成集群;
2)日志恢复数据:通过binlog来实现数据的恢复或主从复制。但是生成日志文件需要考虑的点是:日志保存的格式(文本、二进制等;是否压缩);日志保存的时机(先保存到缓存,再从缓存刷到磁盘)——是定时刷盘,还是事务提交后刷盘呢?如果是定时刷盘,那定时执行间隔设为多少合适呢?哪种方式最能保证机器宕机后数据不丢失呢?;日志多久删除呢?(毕竟磁盘也是有限的撒)
2、redis:
1)集群模式
2)RDB和AOF文件支持数据恢复;
3、kafka:
1)kafka集群:通过zk管理多个broker,组成集群;
2)数据存在日志中,既提供了持久性,也具备高可用性;
3)分区副本:通过数据冗余,提供可靠性,当leader副本挂掉,可以从follow副本选举新的leader副本;
二、高性能
1、redis:
1)内存操作;
2)单线程操作(4.0版本有辅助线程处理非阻塞的删除任务);
2、kafka:
1)多分区,提供横向扩展,一个分区被一个消费者消费,如果需要提供消费速度,可以设置多个分区,让N个消费者去消费(类似于多线程)。
三、总结
1、高可用性一般是由集群+数据持久化存储来实现的;
2、高性能需要结合使用场景,合理使用多线程或单线程。
我了解的也不是很全面,分析的组件也不够多,希望之后有机会实现一些组件的时候,可以参考这些高可用、高性能的组件的实现方式。