-
最早一个线程用,阻塞,无法并发
-
多线程,可并发,资源占用高,线程粒度大,要处理连接,读取和写入
-
reactor模式
-
餐厅举例:
- 多线程:一个服务员服务一个客人,点菜(读取), 吃饭(处理),埋单(写入)
- reactor:一个服务员服务多个客人,事件驱动,当客人点菜的时候,服务员可以去服务其他客人,客人点完菜了,发送一个事件,叫来一个空闲的服务员。。。。
-
reactor需要依赖操作系统提供的selector系统调用(select, poll, epoll)
- select,poll,epoll都是IO多路复用的机制
- select, poll缺点
- 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
- 同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
- select支持的文件描述符数量太小了,默认是1024
- epoll如何解决这些问题
- fd只拷贝一次,在注册时拷贝
- 为每个fd注册一个回调,事件发生时把对应的fd加入就绪列表
- 数量为最大可打开的文件数
- 参考资料
- DNS Round-robin DNS
- 不管服务是否正常
- zookeeper
- nginx
- nginx+, nginx的UI
- fabio
- go语言写的
- TCP/HTTP
- Haproxy
- TCP/HTTP
- Træfik
- 最新的
- 1.7w stars
- 支持多容器
- 支持http2, grpc
- LVS
- 多服务器的负载均衡
- 网络层
- 高性能,高可用的服务器集群技术
- 通过控制IP来实现负载均衡
- VIP
- LVS简介及使用
- keepalived
- 事件驱动
- Faas介绍
- IaaS,PaaS,SaaS 的区别
- 几个开源faas 框架
- 从IaaS到FaaS—— Serverless架构的前世今生
- FaaS,未来的后端服务开发之道
- What Is Function-as-a-Service
- 函数之间的调用和管理是一个棘手的问题
- 安全传输协议TLS
- SSL1.0是SSL3.0的升级版,相当于SSL3.1
- SSL与TLS的区别以及介绍
- SSL/TLS协议运行机制的概述
- dubbo
- java
- grpc
- 跨语言
- ice
- 跨语言(不支持go)
- 高性能
- thrift
- 跨语言
- 原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是ACID
- CAP定理: 一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance) 无法同时达到。
- BASE理论:
- Basically Available(基本可用)
- Soft state(软状态)
- Eventually consistent(最终一致性)
- 两阶段提交(2PC)
- 协调者、参与者
- 协调者宕机会影响整个集群
- 事务过程中所有参与者需要同步阻塞
- 数据没有强一致,当协调者发出commit通知,而参与者未收到时会一直阻塞
- 三阶段提交
- 投票、预提交、提交
- 超时机制
- 没有强一致性
- 补偿事务(TCC)
- try, confirm, cancel
- 数据一致性差,confirm和cancel都可能失败
- 本地消息表(异步确保)
- 业界使用最多(ebay)
- 添加本地消息表
- 消息和业务一起加入本地事务
- 消息通过MQ发送给事务另一端(消费者)
- 消费者通知生产者成功或失败(通过MQ或者直接远程调用)
- 生产者定期扫描消息表,处理未完成的消息
- MQ 事务消息
- 类似两阶段提交的实现
- 保证消息发送与本地事务同时成功或同时失败
- RocketMQ支持事务消息
- 主流的MQ不支持,RabbitMQ, kafka
- Sagas 事务模型(略)
- 参考资料
- jps jvm中的ps命令
- jstack 打印堆栈信息
- jstat 时统计堆内存使用情况
- jmap 打印java进程的内存中的所有对象情况
- jinfo 输出并修改运行时的java 进程的opts
- jconsole 一个java GUI监视工具
- jvisualvm 可视化工具
- jhat 离线分析heap
- jvm-tools
- jvm排查工具箱jvm-tools
- JVM 性能调优监控工具 jps、jstack、jmap、jhat、jstat 等使用详解
- mysql
- postgresql
- redis
-
乐观锁: 认为并发不会带来问题,一开始不拿锁,允许并发,如果失败了再重试或者回滚
- CAS(Compare and Swap 比较并交换), 更新前先比较
- 表中添加version字段,更新时判断version字段是否和之前取到的一致,不一致则重试或回滚
select version, data from t_table; update t_table set data = #{data}, version = version + 1 where version = #{version};
- 如果经常失败则性能差
-
悲观锁: 认为并发会带来问题,一开始就拿锁,不允许并发
- AVL-Tree, B-Tree, B+Tree
- AVL:平衡二叉树
- MyISAM
- B+Tree
- 叶节点的data域存数据记录的地址
- 可以没有主键
- 索引文件和数据文件分开存储
- InnoDB
- B+Tree
- 必须有主键,如果没指定会有隐藏主键
- 数据按主键聚集
- 主键叶子节点保存了数据本身
- 主键索引十分高效
- 辅助索引的data域是主键
- 索引文件包含了数据
- 这篇文章讲得很详细
- 行级锁、表级锁、页级锁
- 表级锁: 锁定整个表(MyISAM),加锁快、易冲突、低并发
- 页级锁: 锁定一个数据块(BDB)
- 行级锁: 锁定索引到的行(InnoDB),加锁慢、不易冲突、高并发
- InnoBD中的两种行级锁:
- 共享锁: ...lock in share mode 允许一个事务去读,阻止其他事务获得相同数据集的排他锁。什么意思:
- 可以读
- 不能加排他锁
- 排他锁: ...for update 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。什么意思:
- 可以读
- 不能加共享锁
- 共享锁: ...lock in share mode 允许一个事务去读,阻止其他事务获得相同数据集的排他锁。什么意思:
- InnoDB事务执行流程
- AMQP协议
- Exchanges: 接收生产者发送的消息
- Exchanges三种模式详解
- Direct: Queue需要bind到Exchange上并要求一个routing key,完全匹配routing key的消息会转发到Queue。
- 消息发送到与Exchange bind的所有Queue上
- Topic: 和Direct的区别是,routing key采用模式匹配
- Queue: 生产者发的消息最终达到这里
- Bindings: 决定消息如何路由到正确的Queue
- Routing key: 消息路由到Queue时的关键词
- Ack: 消息确认,默认为自动确认,server端不必等待consumer端确认,就丢弃消息。开启手动确认后,server端等待consumer确认之后才会丢弃消息。如果consumer未发送ack,则server通过consumer的连接是中断来确认消息是否可以重新发给的其他的consumer。
- 事务和Confirm: 为了解决broker到publisher的确认,默认不开启。
- Topic: 消息按topic组织,生产者向topic发送消息,消息费订单topic的消息
- Partition: 一个topic可以有多个partition, 消息分散在partition中
- Consumer Group: 一个group内可以有多个consumer, 一个group有一个offset。一个topic可以有多个group, 每个group管理自己的offset
- Kafka用zk做什么
- offset管理: kafka不马上删除数据,而是通过更新offset。
- 如何为Kafka集群选择合适的Topic/Partitions数量
- 消息系统kafka之二 kafka的HA(高可用)
- 更数学的思维方式
- 更安全的并发支持
- 为什么学习haskell
- 强类型,强迫写出逻辑严密的代码(代码能编译通过,逻辑基本没问题)
- 代码即文档
- scheme语言概要上, 下
- 48小时写一个Scheme解析器
- haskell趣学指南
- WHAT I WISH I KNEW WHEN LEARNING HASKELL
- stack guide
- haskell学习资料大全
- 语音业务VOIP开发之SIP协议篇:SIP基本场景分析
- 语音业务VOIP开发之SIP协议篇(二) —— SIP报文浅析
- 代理(Proxy)和背靠背用户代理(B2BUA)
- freeswitch中文文档
- opensips官方文档(重要)
- sip via rport
- DTMF原理
- IMS网络架构简介
- IMS相关博文目录
开源软交换系统 FreeSwitch 与 Asterisk 比较
- The magic behind configure, make, make install
- Using Autotools
- configure.ac and configure.in
- automake cmake
- MD5算法原理
- PKCS5 PKCS7
- HEX原理
- 数字签名算法
- 初始化向量, 可以防止暴力破解密钥