Tair 与 Pika 类似,底层支持多种存储引擎,包括 mdb、rdb、ldb,其中 ldb 基于 leveldb(google开源,rocksdb 在其基础上优化),它可将内存存储和持久化相结合,具有高可用的分布式架构,目前开源版本已经不再维护,阿里云上则提供了企业级的 Tair 存储服务。
SSDB
SSDB 也是兼容 Redis 的一款 KV 数据库,目前更新频率较低,相比而言 Pika 目前还在更新中,且有企业进行背书。
消息队列消息队列在请求削峰、跨系统间通信解耦、发布订阅等许多场景下都会使用到,不光能解决这些问题,采用消息驱动的架构可以增强系统的扩展性,比如新增一个订阅方,即可以实现新的功能,并且对当前的系统没有任何的侵入性。
常用的消息队列产品有 kafka、rabbitmq 等,它们各有优缺点,在大数据领域 kafka 占有绝对优势,总体的市场占有率也较高,而 rabbitmq 由于产品成熟,也被广泛使用。
在使用消息队列的过程中,需要处理一系列的细节,比如:定义消息处理者、如何发送消息、如何发布事件、消息如何序列化、如何记录消息记录、设计消息路由、消息处理失败的重试机制、消息 id 等等,在具体的编码过程中不能完全专注于业务代码开发,因此市面上有一些 ESB 产品在内部处理好了这些细节,并从更高的抽象层级提供更加简洁的 API,在开发过程中则能更加聚焦在业务逻辑本身,当我们的系统面临这些问题的时候,不妨选择一个 ESB 产品来提升研发效率。
定时调度简单的定时任务可以采用 linux cron 进行配置,复杂的场景也可以使用分布式任务调度框架,可选的实现方式非常多,这里简单的列举几种。
Quartz
老牌任务调度系统,许多分布式任务调度框架基于它而扩展。
Spring Scheduler
用它来做简单的任务调度非常方便,但要注意由于现在的系统大多采用分布式部署,因此当使用它来做任务调度时最好做到单独的服务中,避免与其他系统耦合。
国产分布式任务调度系统
目前较为流行的有 Elastic-Job、XXL-JOB,Elastic-Job 采用去中心化的架构,依赖 zookeeper 存储任务调度数据,XXL-JOB 采用中心化调度的架构,调度采用 RPC 方式。
PowerJob 是新兴的一个开源任务调度系统,在功能上更为强大,支持 MapReduce 分片,值得关注。
RPC提到 RPC 不得不提到日暮西山的 Web Service,其采用 XML 作为消息格式,并以 SOAP 协议进行封装,由于过于复杂且性能开销较大,其逐渐被采用 JSON 格式的 REST 服务所取代,相比之下,REST 简单且采用更高效的序列化方式,所以目前许多系统广泛采用 HTTP 的方式进行远程过程调用。
在对于性能要求特别高的场景,或从整体架构上考虑,人们才会选用专门的 RPC 产品,这类系统一般拥有更高效的通讯协议和数据传输格式,典型的有 dubbo、grpc、thrift,其中 grpc 具有最优秀的性能。
RPC 框架的原理其实与 HTTP 调用类似,只是采用了更精简的协议头和数据序列化方式,此外在服务注册发现及负载均衡上也做了专门的封装。在 Spring Cloud 中,使用 OpenFeign 进行服务间调用是非常方便的一个选择,其使用 HTTP 方式,当性能无法满足时,可考虑替换序列化方式,或选用 grpc 进行通信。
数据库中间件数据库本身就是一个庞大的产品,除了前面提到的 ShardingSphere、Vitess 这类中间件,还有一类专门做数据处理的中间件。
otter
分布式数据库同步系统,支持 MySQL、Oracle。
canal
基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
DataX-Web
分布式数据同步工具,可用来简化 ETL 工作。
gh-ost
对数据表结构进行架构变更时,可能导致表被锁住,如果数据量特别大,这种问题对于线上发布的影响是比较大的,可以采用建新表并迁移数据再修改表名的方式手工处理,这种方式容易出错且耗时,Github 开源的 MySQL 在线架构迁移工具则是程序化完成这一类操作的很好的选择。
日志系统ELK
日志系统一般采用 ELK 技术栈,这其中包含三个子系统,因此要扩展一个新功能,可以有多种方式切入,比如做监控报警,可以使用 logstash 将 metrics 写入到 Prometheus,也可以使用 kibana 上的 sentinl 插件或者 ElastAlert 插件。
logstash 支持从许多管道收集数据,其中包括 kafka,在日志量特别大的情况下,可以将日志先发送至 kafka。
Sentry
日志在很大一部分场景下都是用于排查错误的,除了 ELK 外还有专注于应用程序错误报告的系统,比如 Sentry。
配置中心