自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 数据同步的设计

线程模型,全量数据同步的线程池+增量数据同步的线程池+单个消费者线程进行拉取数据。线程池参数第一个线程池,管理全量同步任务的core size: 10max size:100存活时间:10ms阻塞队列:LinkedBlockingQueue,容量为50拒绝策略:拒绝策略为抛出异常线程工厂:实现了ThreadFactory接口,为线程个性化命名,方便排除bug第二个线程池,管理数据消费线程的core size: 0max size:50存活时间:0阻塞队列:LinkedBlocki

2020-12-30 14:24:12 413

原创 端点--字符集相关的bug

使用同一套字符集,字节数组转成字符串,再转为字节数组。前后者会发生改变。所以我使用了ISO-8859-1。

2020-12-17 15:15:24 82

原创 数据引擎/聚集索引

存储引擎对比MYISAM索引与数据分开存储,所有索引级别相同,对应的都是指向真正数据的指针,适合读多写少的场景。不支持事务,锁的最小粒度为表锁,不太适合高并发读写。不支持崩溃后的安全恢复。INNODB一个聚集索引外加多个非聚集索引。支持事务,锁的粒度最小为行锁。支持外键。支持崩溃后的安全恢复。MEMORY该存储引擎将数据存储在内存中,适合追求更快的响应速度,适合数据规模小并且不担心数据丢失的场景。聚集索引与非聚集索引聚集索引是指B+树的叶节点存储了整行的数据,非聚集索引是指B+树的叶

2020-12-14 00:21:21 168

原创 消息队列发布订阅模型设计及其原因

模型最开始是这样的:后来为了可以处理消费者消费能力与生产者生产能力不匹配的问题。问题1:生产者生产能力低于消费者消费能力。 最简单的想法增大生产者生产能力或者减小消费者消费能力。前者不可取,因为消息能生产出来的多少取决于系 统,取决于业务。而对于上面的模型,P:C=1:1,消费者减无可减,所以也不可取。所以这个问题无解。仔细想 下,其实一个消费者而已也没有浪费太多性能。问题2:消费者消费能力跟不上生产者生产能力 这就引起了下面的设

2020-12-12 13:45:23 286

原创 Dubbo 连接模型及其原因

Dubbo的四个角色,服务提供者,服务消费者,注册中心,监控中心。Provider Consumer Registry之间两两连接而且都是长连接,Consumer Provider与Monitor之间的连接是短连接。为什么是这样的连接模型?答:Consumer Provider之间为什么是长连接的?Consumer Provider之间的连接是 单一 长连接。为什么这么设计呢?首先我们需要明白,两个进程之间可以建立多个连接,因为一个进程可以绑定多个端口。那么,两进程之间通信,单一连接与多连接有.

2020-12-10 21:14:58 268

原创 什么是RPC,RPC的好处

RPC: remote process call远过程调用,与之对应的是本地过程调用。RPC是将远过程调用进行了一层封装,使得使用者像调用本地方法一样调用远程方法。为什么要进行这样一层封装呢,或者这样说不进行这一层封装又会怎样呢?如果不封装,方法的使用者不会像封装后使用的那样方便,他需要自己来区分出来远程方法调用,对于远程的要采取与本地方法调用不同的手段来调用。但是使用者是不必关心这个方法是不是远程的,他只是像借用外部方法进行处理,然后拿到结果。所以,RPC那一层的封装减去了方法调用者不必要的额外工作

2020-12-10 20:02:55 1390

原创 为什么要有微服务

单体应用(仅一个进程)的优点:方便debug,最大的优点在初期方便代码开发,相比于拆分成各个不同的服务模块,需要定义好不同模块之间的交互规则缺点:在后期,代码量增大,每处改动改处的bug增大,迭代会变慢,而且每次迭代都需要整个应用重新部署。而微服务,只要保证各个模块间交互的接口不变。各个模块可以单独迭代,然后部署。可能仅仅是某块的访问压力增大,却需要将增大整个应用节点。而微服务可以就某个模块进行水平扩容。...

2020-12-10 19:54:15 304

原创 dubbo结合zk实现服务变更自动发现

主要依靠zookeeper的watch机制, watch+/dubbo/sericeName消费者会向zk注册一个watcher监听某一结点,两个要素,节点路径名和回调方法。zk会和provider保持心跳,如果provider失联,对应的node会被删除,或者新的provider上线会请求zk,在某一serviceName下建立一个新的节点。于是/dubbo/serviceName发生变动,触发watch机制,消费者端刷新provider信息...

2020-12-08 17:18:49 652 3

原创 Redis 主从复制原理

redis-master-slave-replication过程原理当从库和主库建立MS关系后,会向主数据库发送SYNC命令主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis从Redis接收到后,会载入快照文件并且执行收到的缓存的命令之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致...

2020-12-07 19:56:58 96

原创 进程结构

2020-12-02 22:02:34 736

原创 C++如何将赋一个对象引用

Object b;Object a=b;//调用了拷贝构造函数Object b;Object& a=b;//赋引用

2020-12-02 19:34:15 185

原创 C++何时合成默认构造函数

先思考这么一个问题,有的时候C++要为一个类合成一个默认构造方法,或者扩充它的构造方法,为什么?合成默认构造方法或者扩充构造方法因为一个类在初始化时需要额外做一些事,比如建立虚方法表,初始化对象成员,这些操作是在新建一个对象的时候需要去做的,只是把他们都放在一起了,那个地方就叫构造方法。这篇文章有一个地方说错了,当有虚基类的时候,不是设置指向虚基类对象的指针,虚基类对象的数据也是和派生对象放在一起的。真正的原因是,虚基类也是基类,原因和基类是一样的。相关文章...

2020-12-02 18:38:23 225

原创 C++中的引用和指针

char a=’a‘;char* b=&a;//指针char& c=a;//引用C++中的引用声明时必须要赋值,而且其指向的地址不可更改。如果引用了一个对象的化,引用.相当于指针->.需要注意的是,通过汇编代码我们发现,一个字符类型的引用,无论是全局变量还是栈中的引用类型参数,其都有内存而且都是8字节,而那个字符是1字节。所以引用本身也是用指针实现的,只不过它不可更改存放的地址。另外引用没有二级或更高的引用。关于何时使用指针类型的参数何时使用引用类型的参数?感觉区别不大,

2020-12-01 22:04:23 84

原创 关于C++中虚函数实现原理的思考

网上对于C++实现原理大都讲到虚方法表这一层就结束了,感觉不是很痛快。下面讨论两个问题。虚方法的实现(多态)为什么非得运行时确定,或者说确定的到底是什么?一个虚方法对应的实现方法可能有多个,他们的地址都不一样,如果不在运行时确定,而是在编译时确定,那么地址一定是写死的只有一个,那肯定是有问题的。到底确定的是什么呢?想想函数调用的过程,栈上分配参数,保存返回地址,保存pc,设置pc,切换esp,ebp。是设置pc这一步非得运行时确定,即确定得时函数地址。2. 虚方法的原理落实到二进制文件到底是怎么实现

2020-12-01 20:24:57 97

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除