cockburst
一个高性能,可靠,异步的本地持久化队列;可以做到重启JVM、重启服务器、或者强制KILL进程时,队列里的数据不丢失,下次启动应用时,仍可以继续消费;当然,天有不测风云,在机器由于不可抗拒的原因---例如断电,地震,机房着火,网管跑路,也是会有丢数据的风险的;
背景
很多时候,我们都会通过blockqueue来提高系统的吞吐量,解耦流程---也就是生产者,消费者模式;但因为blockqueue是非持久化的,一旦应用重新部署或者重启,队列中还有未消费完的数据,数据就没了;老王说“不能让贫穷限制了我们的想象”,这句话还是非常靠谱的,所以我们就写了这么个玩意,“cockburst” 即可以在保证性能情况下又可以解决在服务器重启时数据丢失的问题;原理就是---通过MMAP读写文件时,JAVA进程直接建立起某一段虚拟地址空间和文件对象的关联映射关系,实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,对文件的读写就像在内存中读写一样。这样就算应用抽风DOWN掉或者重启,操作系统依然会帮你把数据force到磁盘上;
队列设计
小时候最害怕两样东西,一个警察,一个是大灰狼;那时候就祈愿发誓,长大了一定要成为至少两样中的一样,结果哪样都没成;想事情不能太极端,程序设计也一样;队列读写性能和数据的完整性和安全性都要兼顾,不能捡了这个扔那个;队列的实现比较简单