多年互联网开发经验,从事业务开发、平台开发、架构设计、云计算、APM等领域。目前专注于供应链方向的解决方案治理和服务交易域
暂时未有相关通用技术能力~
阿里云技能认证
详细说明1.canal消费速度变慢,会造成sink卡住,引发“无法”消费
1.找个比较干净的spring版本,比如2.5.6
2.搞明白spring的大致原理(IOC),避免源码阅读不知所云,毫无条理,核心是要了解ioc的大致架构,核心服务和常用的扩展点
3.BeanFactory的new方法入手了解容器是如何初始化(资源加载策略、校验策略、注册机制),同时也会了解到如何通过平台化的方式支持自定义的bean(handle、namespace)
4.BeanFactory的get方法入手去了解如何去生产和托管对象(装配机制、生产机制、作用域机制:scope的面纱),同时你会发现原理上看到的那些扩展点BeanPostProcessor、InitializingBean的使用场景和使用意图,获取源码里面还发现了不为人知的秘密: nestedBw
5.了解了整个Bean的生产机制,也明白了若干拓展点的使用场景和意图,那么FactoryBean可以用来干嘛,AOP的编织入口在哪里,也就一目了然了
6.可以参考:https://my.oschina.net/tryUcatchUfinallyU?tab=newest&catalogId=300810(之前自己学习轨迹)
你的问题要分开来看,线程数多了性能反而差和如何解决高并发问题两个问题
1.伴随线程数的加剧,cpu和内存的开销也会伴随着增长,最直观的体现的sys增长,分配给业务线程使用的cpu时钟相应会降低;其次线程分配的内存开销无疑家居了GC的开销,对吞吐的影响也是不低
2.如果VM和JVM并没有到瓶颈,这个时候需要考虑是否受限于锁和IO。举个例子logger同步锁和依赖的外部IO瓶颈
关于这个问题需要视情况而定了
1.如果是CPU密集型应用,IO并非瓶颈,可以考虑通过充分使用cpu核数来提高并行度,一般配置cpu core线程即可
2.如果是IO密集型应用,应用的瓶颈集中在外部IO,在外部IO负载范围内可以通过增加线程数的方式解决吞吐问题
3.如果计算任务涉及到锁竞争,可以考虑降低锁的粒度或者取消锁,举个例子ringbuffer
4.基于之上的场景如果需要继续提高并发度,可以考虑做一些热点优化,举个例子热点缓存优化,热点缓存本地优化(不过这个时候就需要考虑本地缓存的大小和失效时间,过长会导致老年代增长过快,触发FGC,这个时候反而得不偿失,经验值一般是20s之内)
5.有的时候也可以考虑用空间换时间,在一些数据封板的场景可以考虑预计算&缓存代替实时计算提高并发度
6.有的时候需要对业务逻辑进行裁剪,针对于不同场景进行计算流程的自定义,裁剪掉不必要的开销
7.一些中间件、jvm和os的优化就不在这个话题里描述了
1.我理解预发和架构理念应该不是制约你从事java架构师的瓶颈,毕竟你已经从业10年多了
2.从你的描述我看到是大数据架构师,更多的是技术架构,而非领域建设和业务架构
3.所以我的理解你的困惑是java的世界里工具和类库太多,中间件层出不穷,基于自身的现状如何快速落地?所以下面的描述会重点介绍一些常用的技能如何编织成一个框架,并能复用到其他领域
4.我自身做过业务架构、apm、dns等技术项目的架构和落地,举个dubbo的实例来说事:rpc框架从指令发出到response经过的那些节点。动态代理、负载均衡、协议层、网络层、服务治理、spring容器。再去对比Haproxy的负载均衡、DNS的UDP网络通信、apm的服务治理策略。Kafka的存储(pagecache)对比于Varnish、cdn厂商的存储。spring基于xsd和生命周期的拓展设计方案。
5.结合第4点我锁描述的那样,Java世界里面的那些meta servcie是可以枚举的:netty、proxy、zk。任何一个优秀的开源产品都囊括了大多数
6.结论是资源很多,优秀的开源产品都是你的资源,就看你愿意钻研多深了
1.首先需要学习java基础,了解常用的语法(参考Thinking in Java),避免下面的学习一脸懵逼
2.假设你已经自学了java,对于常用的语法和技巧已经了然于心。你可以多关注一些优秀的开源产品:dubbo、spring、tomcat。任何一个优秀的开源产品都是经得起挖掘。并且可以根据自己的方向选择学习轨迹。互联网相关可以看看tomcat了解servlet原理和设计理念。
2.1.举个例子,你确定看懂了java io。但是你在学习dubbo和tomcat确定能看懂这些基础是如何实践在生产,有哪些编码技巧和性能优化点需要关注的(使用篇)
2.2.举个例子,你确定看懂了基础语法,但是对于dubbo、spring中的动态代理、单例、装饰器等用法是否看的明白,是否有计划去深入挖掘设计者的意图,这个时候一些设计上的技巧是可以学到的(设计篇)
2.3.举个例子,你确定连spring都看懂了,但是有没有挖掘到DTD和XSD的相关细节,spring在自定义hadler时候如何有效利用XSD。import关键字和ref关键字是如何解决循环依赖问题(延展篇)
3.最后你会发现,大多数生产上我们能用到的优秀产品所涉及的技能和设计理念都是千篇一律,而你需要做的仅仅是先通过书籍和博客了解大致的原理,再通过源码的学习汲取优秀的设计理念和实践经验
4.最后一点很关键,需要喜欢做好总结和沉淀,东西看多了容易忘,但是能沉淀的都是方法论,是指导你后面走得更快更远的明灯,给个demo:https://my.oschina.net/tryUcatchUfinallyU/blog/266783
1.找个比较干净的spring版本,比如2.5.6
2.搞明白spring的大致原理(IOC),避免源码阅读不知所云,毫无条理,核心是要了解ioc的大致架构,核心服务和常用的扩展点
3.BeanFactory的new方法入手了解容器是如何初始化(资源加载策略、校验策略、注册机制),同时也会了解到如何通过平台化的方式支持自定义的bean(handle、namespace)
4.BeanFactory的get方法入手去了解如何去生产和托管对象(装配机制、生产机制、作用域机制:scope的面纱),同时你会发现原理上看到的那些扩展点BeanPostProcessor、InitializingBean的使用场景和使用意图,获取源码里面还发现了不为人知的秘密: nestedBw
5.了解了整个Bean的生产机制,也明白了若干拓展点的使用场景和意图,那么FactoryBean可以用来干嘛,AOP的编织入口在哪里,也就一目了然了
6.可以参考:https://my.oschina.net/tryUcatchUfinallyU?tab=newest&catalogId=300810(之前自己学习轨迹)