Weekly Reading 170910

很久没有更新了,最近比较忙。
今天刚好是第33个教师节,怀念因吾逃课多次而气哭却依旧对我苦口婆心谆谆教诲到毕业的高二高三班主任。可惜花无重开日,人无再少年。当爱因斯坦霍金这些天才的头脑思考想象时间之箭逆向的时候,凡夫俗子只能哀叹滚滚长江东逝水,但将白发唱黄鸡?
所以,第一个链接附上:邓晓芒的邓晓芒:我的恩师修斋先生

-1,
不知道何时知道邓晓芒,但是却是自他和刘小枫一段论战时候开始关注。之前因为刘小枫主编很多非常好的系列著作而青睐,至邓后,方知大师。
下面只附上链接,懒癌复发,提笔忘词,故草草了之了。

0,
https://stackoverflow.com/questions/3222895/what-is-the-issue-with-the-runtime-discovery-algorithm-of-apache-commons-logging

1,You’re not a compiler!
https://blog.frankel.ch/you-not-compiler/#gsc.tab=0
2,
spring cloud 学习(8) - sleuth & zipkin 调用链跟踪
http://www.cnblogs.com/yjmyzz/p/spring-cloud-with-zipkin.html
3,
Dubbo源代码分析八:再说Provider线程池被EXHAUSTED
http://manzhizhen.iteye.com/blog/2391177
有没有道理
所以,为了减少在Provider线程池打满时整个系统雪崩的风险,建议将Dispatcher设置成message:
4,linux性能分析好文章,消除对load average的误解,以及更好的linux system kernel metrics
http://www.brendangregg.com/blog/2017-08-08/linux-load-averages.html

5,在推特上看到一条有感:考古的囚徒困境,在古遗址发现一个泥块做的骰子,科学计算年龄分析是4000年前。
但是,考古学家并不能证明,这是不是哪一个19世纪的盗墓贼开的玩笑,用4000年前当时的泥块磨出的骰子?

6,阿里巴巴机器学习系列课程
http://blog.csdn.net/buptgshengod/article/details/77675909

7,如何免费的让网站启用HTTPS
https://coolshell.cn/articles/18094.html

8,美团点评数据平台融合实践
https://tech.meituan.com/dataplat_coalesce.html

9,基于Raft分布式一致性协议实现的局限及其对数据库的风险,阿里正祥的文章。
https://mp.weixin.qq.com/s?timestamp=1504098595&src=3&ver=1&signature=YJFPuCcWbtbBbQQQmWiVQufHWAzMjFcJrJajcocSrJiPCd4*sXT9Jit16XzUn08bqqDalpHZy0NgvUCPGFzpK*437zVSD4PQxeM3QWOkREdkVSetPmeGewCl160Ub48X664mwmWvmefVbKbbire4XXW8LhdYi*2jOUK4rcwCwoE=
如果上面微信公号 OceanBase过期的话,试一试这个: http://blog.sina.com.cn/s/blog_3fc85e260102wr0c.html

10, 城市级故障自动无损容灾的“新常态”方案
https://mp.weixin.qq.com/s/qyFbqCQr-iAY1A8VfQuYKA

12,蒙特利尔大学开放MILA 2017夏季深度学习与强化学习课程视频(附完整PPT)
https://zhuanlan.zhihu.com/p/28922147?group_id=886303000086335488

13.Java performance techniques The cost of HotSpot runtime optimizations by Ionut Balosin
https://www.youtube.com/watch?v=NURE0ZPBVPA

14.BILL JOY FINDS THE JESUS BATTERY
https://www.wired.com/story/bill-joy-finds-the-jesus-battery/
https://twitter.com/kevin2kelly/status/898706414394163200

15,
http://www.layer9.org/2017/08/paper-3-re-architecting-datacenter.html

16,A history of branch prediction from 1500000 BC to 1995
https://danluu.com/branch-prediction/
分支预测,大家可以搜索java分支预测优化的技术

17.
http://muratbuffalo.blogspot.com/2017/08/retrospective-lightweight-distributed.html

18,http://blog.didispace.com/why-spring-boot-tran/
19,!!!!!!
https://www.kancloud.cn/kancloud/mysql-design-reference/47425
20,
http://highscalability.com/blog/2017/9/1/stuff-the-internet-says-on-scalability-for-september-1st-201.html

The Amish use a canary approach when choosing which technologies to adopt. Kevin Kelley, “Wired” Founding Executive Editor & “The Inevitable” author/futurist, explains how on This Week In Startups. The Amish aren’t luddites, they’re slow followers, selective curators who admit technologies into their portfolio based on deeply held core principles. Individuals don’t choose which technologies to adopt, the community decides based on how it impacts the family and community. They ask: will this technology allow me to spend more time with my family? Will this technology increase the strength of our community? Cell phones are allowed, smart phones are not. Cars were rejected because they let people travel far away from family and community. A horse & buggy keeps everyone within a 15 mile radius. Eating meals together as a family is important, so the Amish create backyard businesses. Using a CNC milling machine is OK because it keeps the family together. Solar panels and chain saws are also OK. They have Amish computers, which are computers without an internet connection. And the computer is used in the office only, not at home. How do they pick which technologies to use? They try them. One or two early adopter families use a technology and they are observed. If it’s deemed the technology hurts the family or the community, then the technology is voted off the island.

21,
https://github.com/Developer-Y/cs-video-courses
http://muratbuffalo.blogspot.com/2017/08/retrospective-lightweight-distributed.html

22。 https://www.ziwenxie.site/2017/01/02/unix-network-programming-asynchronous/
阻塞式IO(默认),非阻塞式IO(nonblock),IO复用(select/poll/epoll),signal driven IO(信号驱动IO)都是属于同步型IO,因为在第二个阶段: 从内核空间拷贝数据到程序空间的时候不能干别的事。只有异步I/O模型(AIO)才是符合我们上面对于异步型IO操作的含义,在1.wait for data,2.copy data from kernel to user,这两个等待/接收数据的时间段内进程可以干其他的事情,只要等着被通知就可以了。
select/poll/epoll
即使现在的各个Linux版本普遍引入了copy on write和线程,但实际上进程/线程之间的切换依然还是一笔很大的开销,这个时候我们可以考虑使用上面提到到多路IO复用,回顾一下我们上面提到的多路IO复用模型的基本原理:一个进程可以监视多个文件描述符,一旦某个文件描述符就绪(读/写准备就绪),能够信号通知程序进行相应的读写操作。下面我们就来简单的看一下多路IO复用的三种方式。
select
int select (int maxfdp1, fd_set readset, fd_set writeset, fd_set exceptset,
const struct timeval
timeout);
如上面的方法声明所示, select监听三类描述符: readset(读), writeset(写), exceptset(异常), 我们编程的时候可以制定这三个参数监听对应的文件描述符。正如前面提到的,select调用后进程会阻塞, 当select返回后,可以通过遍历fdset,来找到就绪的描述符。
select优点在于它的跨平台,但是也有显著的缺点单个进程能够监视的文件描述符的数量存在最大限制,默认设置为1024/2048,虽然设置可以超过这一限制,但是这样也可能会造成效率的降低。而且select扫描的时候也是采用的轮循,算法复杂度为O(n),这在fdset很多时效率会较低。
下面总结一下select的三个缺点,在下面我们来看epool是如何解决这些缺点的:
每次调用select,都需要将fd_set从用户态拷贝到内核态。
每次调用select都要在内核遍历所有传递过来的fd_set看哪些描述已经准备就绪。
select有1024的容量限制。
poll
int poll (struct pollfd fdarray, unsigned long nfds, int timeout);
poll和select并没有太大的区别,但是它是基于链表实现的所以并没有最大数量限制,它将用户传入的数据拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次的遍历。算法复杂度也是O(n)。
epoll
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event
event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
select和poll都只提供了一个函数。而epoll提供了三个函数: epoll_create是创建一个epoll句柄, epoll_ctl是注册要监听的事件类型, epoll_wait则是等待事件的产生。与select相比,epoll几乎没有描述符限制(cat /proc/sys/fs/file-max可查看)。它采用一个文件描述符管理多个描述符,将用户的文件描述符的事件存放到kernel的一个事件表中,这样在程序空间和内核空间的只要做一次拷贝。它去掉了遍历文件描述符这一步骤,采用更加先进的回调(callback)机制,算法复杂度降到了O(1)。p.s: 虽然表面看起来epoll非常好,但是对于连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,因为epoll是建立在大量的函数回调的基础之上。
下面我们来总结一下epoll是如何解决select的三个缺点的:
在epoll_ctl每次注册事件到epoll句柄的时候,会将fd拷贝到内核中,保证了每个fd在整个过程中只会拷贝一次。
对于第二缺点,epool_ctl为每个fd指定一个回调函数,当设备就绪,就会调用这个回调函数,而这个回调函数会把准备就绪的fd加入一个就绪链表,而不用像select那样去重新遍历一次看有哪些准备就绪的文件描述符。
对于第三个缺点,我们上面已经提及到了,epoll几乎没有容量限制,可以通过cat /proc/sys/fs/file-max来查看。

23.
http://lovestblog.cn/blog/2015/05/12/direct-buffer/

24。
https://shipilev.net/jvm-anatomy-park/2-transparent-huge-pages/

25.
Translation Lookaside Buffer:TLB
https://zh.wikipedia.org/wiki/%E8%BD%89%E8%AD%AF%E5%BE%8C%E5%82%99%E7%B7%A9%E8%A1%9D%E5%8D%80
https://baike.baidu.com/item/TLB

26.
http://blog.csdn.net/dm_vincent/article/details/76735888
本文分析了Spring Boot启动时的关键步骤,主要包含以下两个方面:
SpringApplication实例的构建过程
其中主要涉及到了初始化器(Initializer)以及监听器(Listener)这两大概念,它们都通过META-INF/spring.factories完成定义。
SpringApplication实例run方法的执行过程
其中主要有一个SpringApplicationRunListeners的概念,它作为Spring Boot容器初始化时各阶段事件的中转器,将事件派发给感兴趣的Listeners(在SpringApplication实例的构建过程中得到的)。这些阶段性事件将容器的初始化过程给构造起来,提供了比较强大的可扩展性。
如果从可扩展性的角度出发,应用开发者可以在Spring Boot容器的启动阶段,扩展哪些内容呢:
初始化器(Initializer)
监听器(Listener)
容器刷新后置Runners(ApplicationRunner或者CommandLineRunner接口的实现类)
启动期间在Console打印Banner的具体实现类

27.
MySQL索引
https://www.kancloud.cn/kancloud/mysql-design-reference/47425
28.
https://www.confluent.io/blog/publishing-apache-kafka-new-york-times/?utm_source=wanqu.co&utm_campaign=Wanqu+Daily&utm_medium=website
29.
http://www.baeldung.com/java-stream-indices
30.
Spring Boot实现自动配置的基础
http://blog.csdn.net/dm_vincent/article/details/77435515
31.
百度开源项目推荐
http://itindex.net/detail/57429-%E7%99%BE%E5%BA%A6-%E5%BC%80%E6%BA%90-%E9%A1%B9%E7%9B%AE
32.
Lucene’s near-real-time segment index replication
http://blog.mikemccandless.com/2017/09/lucenes-near-real-time-segment-index.html
33.
不使用synchronized和lock,如何实现一个线程安全的单例?
http://www.hollischuang.com/archives/1860
34.
reddit搜索简史
https://redditblog.com/2017/09/07/the-search-for-better-search-at-reddit/
35.
分布式学习资源list Resources for Getting Started with Distributed Systems
https://caitiem.com/2017/09/07/getting-started-with-distributed-systems/
36.
http://www.cakesolutions.net/teamblogs/scalameta-tut-cache