成之前的功能了。
跨库查询的问题及解决
一张逻辑表,对应多个数据库的多张数据表,在一些场景下比较复杂,如排序、最大最小求和等函数处理、求平均值、非排序分页、排序后分页。
如何对外提供数据访问层的功能
1、为用户提供专有API
2、通用的方式,数据层JDBC
3、基于ORM或类ORM接口的方式
直接基于JDBC驱动方式较好~
数据层的整体流程
SQL解析==>规则处理==>SQL改写==>数据源选择==>SQL执行==>结果集返回合并处理
1、SQL解析阶段
- SQL解析并不完备
- SQL中不带有分库条件,但实际上是可以明确指定分库的
2、规则处理阶段
- 采用固定哈希算法作为规则,如根据用户id取模,id mod 2分库,再id mod 4分表。实现简单,但是如果扩容的话比较复杂!
- 一致性哈希,节点对应的哈希值为一个范围,分配给现有节点。如果有节点加入,会从原有节点分管一部分范围的哈希值;如果有节点退出,会把哈希值交给下一个节点管理
- 虚拟节点对一致性哈希的改进,引入虚拟节点,如4个物理节点可以变为多个虚拟节点,每个虚拟节点支持连续的哈希环上的一段。
- 映射表与规则自定义计算方式,映射表是根据分库分表字段的值的查表法来确定数据源的方法,一般用于对热点数据的特殊处理。
3、为什么要改写SQL
分库分表后,同一个卖家的商品可能会分在多个库中,查询就要跨库。分布的不同数据库中的表的结构虽然一样,但是表的名字、索引名字未必一样,所以要修改SQL。
还有需要修改SQL的地方,如跨库计算平均值,必须修改SQL获取数量、总数后再进行计算。
4、如何选择数据源,读写分析
5、执行SQL和结果处理阶段,异常处理和判断
第六章 消息中间件
JMS,Java Message Service是Java EE中关于消息的规范,ActiveMQ等是对这个规范的实现。如果是小型系统直接使用JMS是一个经济的选择,在大型系统中不适合使用JMS。
如何解决消息发送一致性
消息发送一致性是指产生消息的业务动作与消息发送一致,即如果业务操作成功了,那么由这个操作产生的消息一定要发送出去。
1、发送消息给消息中间件
2、消息中间件入库消息
3、消息中间件返回结果
4、业务操作
5、发送业务操作结果给消息中间件
6、更改存储中消息状态
……
注:后面内容略,不方便摘要
参考:《大型网站系统与Java中间件实践》