4.7. 中间件

4.7.1. Web Server

Nginx

OpenResty

Tengine

Apache Httpd

Tomcat

架构原理

调优方案

Jetty

  • 《Jetty 的工作原理以及与 Tomcat 的比较》

  • 《jetty和tomcat优势比较》

    • 架构比较:Jetty的架构比Tomcat的更为简单。

    • 性能比较:Jetty和Tomcat性能方面差异不大,Jetty默认采用NIO结束在处理I/O请求上更占优势,Tomcat默认采用BIO处理I/O请求,Tomcat适合处理少数非常繁忙的链接,处理静态资源时性能较差。

    • 其他方面:Jetty的应用更加快速,修改简单,对新的Servlet规范的支持较好;Tomcat 对JEE和Servlet 支持更加全面。

4.7.2. 缓存

本地缓存

4.7.3. 客户端缓存

4.7.4. 服务端缓存

Web缓存

Memcached

Redis

  • 《Redis 教程》

  • 《redis底层原理》

    • 使用 ziplist 存储链表,ziplist是一种压缩链表,它的好处是更能节省内存空间,因为它所存储的内容都是在连续的内存区域当中的。

    • 使用 skiplist(跳跃表)来存储有序集合对象、查找上先从高Level查起、时间复杂度和红黑树相当,实现容易,无锁、并发性好。

  • 《Redis持久化方式》

    • RDB方式:定期备份快照,常用于灾难恢复。优点:通过fork出的进程进行备份,不影响主进程、RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。缺点:会丢数据。

    • AOF方式:保存操作日志方式。优点:恢复时数据丢失少,缺点:文件大,回复慢。

    • 也可以两者结合使用。

  • 《分布式缓存–序列3–原子操作与CAS乐观锁》

架构

回收策略

Tair

  • 官方网站

  • 《Tair和Redis的对比》

  • 特点:可以配置备份节点数目,通过异步同步到备份节点

  • 一致性Hash算法。

  • 架构:和Hadoop 的设计思想类似,有Configserver,DataServer,Configserver 通过心跳来检测,Configserver也有主备关系。

几种存储引擎:

  • MDB,完全内存性,可以用来存储Session等数据。

  • Rdb(类似于Redis),轻量化,去除了aof之类的操作,支持Restfull操作

  • LDB(LevelDB存储引擎),持久化存储,LDB 作为rdb的持久化,google实现,比较高效,理论基础是LSM(Log-Structured-Merge Tree)算法,现在内存中修改数据,达到一定量时(和内存汇总的旧数据一同写入磁盘)再写入磁盘,存储更加高效,县比喻Hash算法。

  • Tair采用共享内存来存储数据,如果服务挂掉(非服务器),重启服务之后,数据亦然还在。

4.7.5. 消息队列

消息总线

消息总线相当于在消息队列之上做了一层封装,统一入口,统一管控、简化接入成本。

消息的顺序

RabbitMQ

支持事务,推拉模式都是支持、适合需要可靠性消息传输的场景。

RocketMQ

Java实现,推拉模式都是支持,吞吐量逊于Kafka。可以保证消息顺序。

ActiveMQ

纯Java实现,兼容JMS,可以内嵌于Java应用中。

Kafka

高吞吐量、采用拉模式。适合高IO场景,比如日志同步。

Redis 消息推送

生产者、消费者模式完全是客户端行为,list 和 拉模式实现,阻塞等待采用 blpop 指令。

ZeroMQ

TODO

4.7.6. 定时调度

单机定时调度

分布式定时调度

4.7.7. RPC

Dubbo

** SPI ** TODO

Thrift

gRPC

服务端可以认证加密,在外网环境下,可以保证数据安全。

4.7.8. 数据库中间件

Sharding Jdbc

4.7.9. 日志系统

日志搜集

4.7.10. 配置中心

servlet 3.0 异步特性可用于配置中心的客户端

4.7.11. API 网关

主要职责:请求转发、安全认证、协议转换、容灾。