首页 文章 精选 留言 我的

精选列表

搜索[架构师],共6913篇文章
优秀的个人博客,低调大师

如何用架构师思维解读区块链技术?

导读:很多童鞋反馈,区块链技术有点绕,有点晦涩,大都是一知半解,理解不够通彻。但在阿里技术专家郑吉看来,区块链特别是比特币本身,并没有使用高大上复杂的新技术,只是对现有技术的组合。其天才的地方体现在系统的架构上,体现在把金融学,货币学,博弈学,甚至是哲学思想体现在比特币的系统架构上。如果单纯从系统中的技术点着手学习研究,那么往往就会觉得有点绕,有点晦涩。这就像我们在平时工作中了解某个系统,如果首先搞清楚业务本身,了解清楚系统架构的设计,再去看具体的实现技术,从大局到面到点,那么就有豁然开朗的感觉。 今天,郑吉将试着帮助大家转换视角,从架构的思维分析去解析比特币,从而对区块链技术有一个更深入的理解。 准备工作 区块链不是一种技术实现,而是一个系统的架构设计,使用一系列的技术组合用于完成去中心化的数据存储。比特币在区块链之上融入了金融学,货

优秀的个人博客,低调大师

我是架构师--设计模式-单例模式

来次面试吧?准备好没,GO! 问:自我介绍下吧。(开个玩笑。。。往下)请问你用过单例模式吗?什么是单例? 答:用过啊,单例模式就是只创建一个实例。 问:噢?那是单线程,还是多线程下都是呢? 答:这个类在JVM里就一个实例(这样回答也许会更好) (注:通常面试官,到这里,就会让你写一个单例,当然我们不,你看这篇文章,就是不让你再网上找其他重复的资料了。) 问:说说你用的场景吧 答:........ 问:说说单例的几种类型?或者说何时对实例的初始化? 答:........ 问:画过单例的类图吗?会画吗? 答:(需要吗?) 问:写个单例的实现吧? 类名:SingleTon 实例:uniqueInstance 简称ust吧。(这里我插入一句编程规范:起名不要吝惜把实例代表的意思表达清楚,名字可稍微长点,这里就是想偷懒) 实现1: publicclassSingleton{ privatefinalstaticSingletonust=newSingleton(); privateSingleton(){} publicstaticSingletongetInstance(){ returnust; } } 注:这里顺便说明一下语法。通常final与static同时出现,习惯让final在前 分析: 1. 这里需要加final吗? 是的,因为java反射,可以改变private描述的变量 2. 有书里把这种方式称为饿汉单例模式(另一个种叫懒汉单例),并且已经为人所接受 3. 在多线程方面表现出了他优势,不需要担心方法重复里延时创建带来的原子性(这样说难理解,其实就是出现两个或多个实例) 4. 这个,不符合我们习惯的 用到时再实例化的原则(不过这没关系。。。) 看,其实你发现这还是个不错的单例,那么其实有个最好的实现,最好的实现: 单元素的枚举类型已经成为Singleton的最佳实践 即使面对复杂的序列化或者反射攻击,绝对防止多次实例化,还有他的简洁和优雅。 ----好吧,面试结束了。 其实你对单例的理解还是不错的,而且你已经得到了最好的答案,有兴趣彻底玩转单例吗,继续听我唠叨。 我们看看懒汉单例模式: 实现2: publicclassSingleton{ //privatefinalstaticSingletonust=null; // 不该加final,这里明显有偷懒嫌疑,复制上面的例子,又测试不够,以后尽量避免类似问题。 // 8月15日修正 private static Singleton ust = null; privateSingleton(){} publicstaicSingletongetInstance(){ //建议null==ust的方式,能帮助更快的发现错误。 //部分老程序员的习惯,其实许多IDE会发现些低级错误。 if(ust==null){//A ust=newSingleton();//B } returnust; } } 分析: 1. 懒汉模式,做到了需要时创建实例 2. 他遇到了尴尬的问题,因为当两个线程分开运行到A,然后进入了if块,可能就创建了2个实例,草稿的是,你已经初始了一些数据。 改进一下: 实现3: publicclassSingleton{ privatevolatilestaticSingletonust; privateSingleton(){} publicstaicSingletongetInstance(){ synchronized(Singleton.class){ if(ust==null){ ust=newSingleton(); } } returnust; } } 分析: 1. 如果你不理解synchronized 的位置,就不用单例模式这么多写法,不如学习基础 2. volatile 确保ust被实例化后,多个线程正确处理。他失去了JVM必要的代码优化,如果不是多线程,就不要用 3. 这个叫做 “双检查加锁”,单例最后一种方式 综合讨论会: 小明: 单例目前一共谈到懒汉和饿汉两种,还有双检查加锁,最好的应该是单元素的枚举类型 小刚: 是的,回答了开头说的几种单例,那么哪些场景应该用单例呢? 小明: 我知道,有线程池,缓存,处理偏好设置,注册表,日志对象等等 小刚: 对,我对java比较了解,我知道Runtime.getRuntime()。 C(为吗我叫C):我知道有java.lang.reflect.Proxy类 小明:有什么共同点呢,为什么用?是遵循对象尽量少创建原则? C:这是什么意思? 小刚:这很简单,不过这说法有点问题。因为对象占内存,有要造成垃圾回收,GC的时候JVM可是只干这个麻烦事 小明:是啊! 小刚:我想我知道,某些对象最好只有一个实例,多了会有问题产生。 C:什么问题? 小刚:比如缓存,你从哪个实例里拿缓存呢? 小明:是的啊。。。 结束讨论会,总结一下吧。不,等等,还要补充两句: 1. 单例模式定义:确保一个只有一个实例,并提供一个全局访问点 2. 如果getInstance()方法对应用程序不会额外负担,或者说影响不大,那写成怎样,其实没太大所谓。但是如果频繁运行,就要仔细考虑,因为一个同步,可能使得执行效率下降100倍 继续总结,还差个UML图呢,不妨在上个枚举的例子吧,枚举构造器默认私有吗? 枚举就算了,是不是默认构造器,自己研究下吧。。。呵呵 这回真总结了: 1. 单例,有懒汉,饿汉,双检查加锁3种常见用法 2. 单例模式,是因为如果多了,会造成数据遗漏等麻烦 3. 最好的单例,单元素的枚举类型 呵呵,其实,就这些,本来想先写工厂的,因为去面试,遇到某些对单例了解比较浅,解释起来费劲,于是先以单例开篇,请关注下篇工厂模式。 本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/yjplxq/931861,如需转载请自行联系原作者

优秀的个人博客,低调大师

如何面对JAVA架构师,和学习方法。

宏观上: 1.技术广度方面 至少要精通多门开源技术吧,研究过struts\spring等的源码。 2.项目经验方面 从头到尾跟过几个大项目,头是指需求阶段,包括需求调研。 尾是指上线交付之后,包括维护阶段。 3.架构经验方面 有过分布式系统的架构和开发经验。对于跨系统的结构优化,数据存储的性能指标等有丰富经验。什么缓存啊、数据库的垂直切分什么的,业务的抽象和水平拆分啊,这些应该都轻车熟路吧。 4.行业领域方面 最起码得精通一到两门业务吧,所谓精通,就是比如做金融证券业务的,至少等当半个经融分析师。做电力业务的,至少等当半个电力工程师。 5.个人修为 有自己一些独到的见解,不会人云亦云啦。 微观上: 1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该十分了解UML,尤其是class,object,interaction以及statediagrams。 2.你需要学习java语言的基础知识以及它的核心类库(collections,serialization,streams,networking, multithreading,reflection,event,handling,NIO,localization,以及其他)。 3.你应该了解JVM,classloaders,classreflect,以及垃圾回收的基本工作机制等。你应该有能力反编译一个类文件并且明白一些基本的汇编指令。 4.如果你将要写客户端程序,你需要学习WEB的小应用程序(applet),必需掌握GUI设计的思想和方法,以及桌面程序的SWING,AWT, SWT。你还应该对UI部件的JAVABEAN组件模式有所了解。JAVABEANS也被应用在JSP中以把业务逻辑从表现层中分离出来。 5.你需要学习java数据库技术,如JDBCAPI并且会使用至少一种persistence/ORM构架,例如Hibernate,JDO, CocoBase,TopLink,InsideLiberator(国产JDO红工厂软件)或者iBatis。 6.你还应该了解对象关系的阻抗失配的含义,以及它是如何影响业务对象的与关系型数据库的交互,和它的运行结果,还需要掌握不同的数据库产品运用,比如 racle,mysql,mssqlserver。 7.你需要学习JAVA的沙盒安全模式(classloaders,bytecodeverification,managers,policyandpermissions,codesigning, digitalsignatures,cryptography,certification,Kerberos,以及其他)还有不同的安全/认证 API,例如JAAS(JavaAuthenticationandAuthorizationService),JCE (JavaCryptographyExtension),JSSE(JavaSecureSocketExtension),以及JGSS (JavaGeneralSecurityService)。 8.你需要学习Servlets,JSP,以及JSTL(StandardTagLibraries)和可以选择的第三方TagLibraries。 9.你需要熟悉主流的网页框架,例如JSF,Struts,Tapestry,Cocoon,WebWork,以及他们下面的涉及模式,如MVC/MODEL2。 10.你需要学习如何使用及管理WEB服务器,例如tomcat,resin,Jrun,并且知道如何在其基础上扩展和维护WEB程序。 11.你需要学习分布式对象以及远程API,例如RMI和RMI/IIOP。 12.你需要掌握各种流行中间件技术标准和与java结合实现,比如Tuxedo、CROBA,当然也包括javaEE本身。 13.你需要学习最少一种的XMLAPI,例如JAXP(JavaAPIforXMLProcessing),JDOM(JavaforXMLDocumentObjectModel),DOM4J,或JAXR(JavaAPIforXMLRegistries)。 14.你应该学习如何利用JAVAAPI和工具来构建WebService。例如JAX-RPC(JavaAPIforXML/RPC),SAAJ (SOAPwithAttachmentsAPIforJava),JAXB(JavaArchitectureforXMLBinding),JAXM(JavaAPIforXMLMessaging), JAXR(JavaAPIforXMLRegistries),或者JWSDP(JavaWebServicesDeveloperPack)。 15.你需要学习一门轻量级应用程序框架,例如Spring,PicoContainer,Avalon,以及它们的IoC/DI风格(setter,constructor,interfaceinjection)。 16.你需要熟悉不同的J2EE技术,例如JNDI(JavaNamingandDirectoryInterface),JMS (JavaMessageService),JTA/JTS(JavaTransactionAPI/JavaTransactionService),JMX (JavaManagementeXtensions),以及JavaMail。 17.你需要学习企业级JavaBeans(EJB)以及它们的不同组件模式:Stateless/StatefulSessionBeans,EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL),或者 Message-DrivenBeans(MDB)。 18.你需要学习如何管理与配置一个J2EE应用程序服务器,如WebLogic,JBoss等,并且利用它的附加服务,例如簇类,连接池以及分布式处理支援。你还需要了解如何在它上面封装和配置应用程序并且能够监控、调整它的性能。 19.你需要熟悉面向方面的程序设计以及面向属性的程序设计(这两个都被很容易混淆的缩写为AOP),以及他们的主流JAVA规格和执行。例如AspectJ和AspectWerkz。 20.你需要熟悉对不同有用的API和frame work等来为你服务。例如Log4J(logging/tracing),Quartz (scheduling),JGroups(networkgroupcommunication),JCache(distributedcaching), Lucene(full-textsearch),JakartaCommons等等。 21.如果你将要对接或者正和旧的系统或者本地平台,你需要学习JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。 22.你需要熟悉JINI技术以及与它相关的分布式系统,比如掌握CROBA。 23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs),例如Portlets(168),JOLAP(69),DataMiningAPI(73),等等。 24.你应该熟练掌握一种JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜欢VI或EMACS来编写文件。随便你用什么了: 25.JAVA(精确的说是有些配置)是冗长的,它需要很多的人工代码(例如EJB),所以你需要熟悉代码生成工具,例如XDoclet。 26.你需要熟悉一种单元测试体系(JNunit),并且学习不同的生成、部署工具(Ant,Maven)。 27.你需要熟悉一些在java开发中经常用到的软件工程过程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。 28.你需要能够深入了解加熟练操作和配置不同的操作系统,比如GNU/linux,sunsolaris,macOS等,做为跨平台软件的开发者。 29.你还需要紧跟java发展的步伐,比如现在可以深入的学习javaME,以及各种java新规范,技术的运用,如新起的web富客户端技术。 30.你必需要对opensource有所了解,因为至少java的很多技术直接是靠开源来驱动发展的,如java3D技术。 1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。 2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。 3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。 4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。 5.群号:532259952 里面可以学习和交流,也有资料可以下载 6.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知! 学习方法 1:掌握良好的学习心态 2:掌握系统化的学习方法 3:知识如何内化成能力 4:广度和深度的选择 实战技巧 1:你需要学会的编码习惯 2:在业务团队做开发如何成长 掌握良好的学习心态 空杯心态 首先要有空杯的学习心态,而不是傲娇自满,故步自封,空杯子才可以装下更多的东西。首先要学会取百家之长,带着欣赏的眼光看团队的同事或学校的同学,欣赏每位同事或同学的优点,然后吸取他们的优点,每个同事都有其擅长的能力,比如有的同事技术能力强,那么可以观察下他如何学习的(或者找他请教学习方法),有的同学擅长解决线上问题,那么观察他是如何解决线上问题的,解决思路是什么?如果他解决不了时,他是如何寻求帮助。有的同学擅长使用IDE或MAC的快捷键,那么可以向他学习提高工作效率。有的同学能快速理解业务知识,观察他是如何做到的,自己如何达到他的程度。沟通能力,解决问题能力以及规划能力都可以向同事学习。 挑战权威 从书上看到一个知识点,或者从别人那里听到一个知识点,一定要去挑战和质疑这个知识点的正确性,否则学到的知识点可能是错误的。先用逻辑思维推测下,再实战检测下,一定要记住实践是检验真理的唯一标准。比如同事说这个SQL加这个索引是最快的,首先要思考同事的结论是如何得出的,是靠历史经验还是测试过,如果我们没有经验,就加上这个索引跑下SQL,看看执行计划和执行时间,再换下其他索引试试会不会更快。依次类推,并发一定比串行快吗?无锁一定比加锁快吗? 很多结论都是在特定的场景下才会产生的,一定要自己亲手实践验证下。 坚持学习 有的同学可能工作了五年,但是学习的时间可能一年都不到。学技术不能急于求成,只要学习方法正确,量变一定会引起质变。我在大学刚学JAVA时,怎么都学不会,但是坚持学习了几个月,每天看张老师的JAVA视频教学,买书按照书里的代码一行一行的敲代码,白天睡觉,晚上学习和写代码,写到宿舍关灯时就去避风塘呆一晚上,早上6点钟回宿舍睡觉,学到一定时间后,突然恍然大悟,才入了门。 在工作中,我曾经花了一个月的时间学习AOP的实现原理,学习了各种方式来实现AOP的原理,并写了几种实现方式的代码,虽然花的时间很多,但是到现在仍记忆犹新,对于排查问题和学习其他知识都非常有帮助。 要做到坚持学习,学习的环境非常重要。如果你想学,但是又不在学习状态,可以考虑换个学习环境,我经常会去星巴克看书和学习。我听说有的同事会周末抽一天去大学教师上自习。 把事做精 对自己要求越高,进步越快。要有强烈的把事情做完美的心态,我刚开始工作的时候,总是快而不精,做事做的不够细致,总希望快速拿出结果证明自己,但是反而证明不了什么,技术能力也得不到提升,缺少技术亮点,在团队中也没什么影响力,后面就开始锻炼一次就把事情做对的心态和方法。我观察过,很多人都擅长快速做事情,但是把事情做好做精致的人会比较少,但是结果却是 在精益求精的路上才会快速提高自己的能力 。比如用100行代码实现的功能,思考下是否可以用10行来实现,以便于降低运维成本,提高下次的编码效率。引用GUAVA等类库,提取公共方法,和使用JDK8新特性等。系统的方法压测过后,单机只能承受1700QPS,可以思考和实践能否优化下程序提高QPS,减少服务器数量。 把事情做精,一定是要强迫自己多花心思多花时间在这件事情上。有位技术牛人给我分享了一个心得,我觉得说的非常好,老板给你布置了一个任务, 你要花百分之150的精力做到100分,这样在老板那里你就能拿到80分或者60分 。 掌握系统化的学习方法 如果学习到的知识不成体系,那么遇到问题时就会非常难解决。有些同学会出现这些情况,比如编码时遇到问题百度搜索,如果百度上找不到答案,这个问题就解决不了。再比如,在开发中要用到某个技术点,就学习下API,程序调通后就不再深入研究,浅尝辄止,如果程序遇到其他问题也不知道如何解决。 以上情况我认为叫 点状学习 。遇到一个问题,解决一个问题,需要一项技术,学习一项技术。那么如何由点到面,由面到体,形成系统化学习呢。 首先要确定学习的知识领域,需要达成的学习目标,针对目标制定学习计划,就像你要写一本书一样,先把目录写出来,然后根据目录上的知识点逐步去学习,最后把这些知识点关联起来,形成一个系统化的知识体系。学习的时候,可以制定一个计划,以周为单位,比如第一周学什么,第二周学什么。 比如我最近在学习人工智能,学习步骤是: 1: 高数基础知识:线性代数,微积分和统计学。最近在打德州扑克时,我也会用统计学里的知识计算下输赢的概率。 2: 人工智能基础:买几本书人工智能的基础书籍,如《机器学习基础教程》《Python机器学习》 3:框架:TensorFlow等。 4:实战:在工作中找到一个应用场景,把学到的知识运用进去。 知识如何内化成能力 作家格拉德威尔在《异类》一书中指出,1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。1万小时有多久?每天学习10小时,需要大约三年。但是很多人都工作了五年甚至更长,但是为什么成为世界级大师的却非常少。读者可以先自己思考下这个问题。接下来谈谈我的看法。 成长必须经历一个步骤,就是把知识内化成能力。 知识是用脑记住的,能力是用手练习出来的 。在工作的几年里,我们可能看过很多书,听过很多技术讲座和视频,但是通过听和看只是让你能记住这些知识,这些知识还不能转换成你的能力。 听和看只是第一步,更重要的是实践,通过刻意练习把听到和看到的知识内化成你的能力。 刻意练习,就是有目的的练习,先规划好,再去练习。首先给自己定一个目标,目标可以有效的引导你学习,然后使用3F练习法: 1: 专注(Focus),专注在眼前的任务上,在学习过程中保持专注,可以尝试使用番茄工作法。 2:反馈(Feedback),意识到自己的不足,学习完之后进行反思,思考下自己哪些方面不足,为什么不足, 3: 修正(Fix),改进自己的不足。 不停的练习和思考可以改变大脑结构,大脑像肌肉一样,挑战越大,影响越大,学习更高效,并且也会产生突破性。 广度和深度的选择 技术人员的学习路径有两个维度,深度和广度。很多程序员都有这个疑问,是先深后广,还是先广后深呢? 通过这么多年的学习和思考,我的建议先深后广,因为当技术学到一定深度后,就会有触类旁通的能力,自己掌握的广度也自然有了深度。但是在实际学习过程中,深度和广度相互穿插着学习,比如学习并发编程时,首先学习JDK源码,然后学进去之后,开始看JVM源码,最后看CPU架构,在技术点逐渐深度研究的过程中,广度也得到了完善。 所以无论哪种学习方式,学习态度才是最重要的,在广度学习的时候有深入研究的态度就能达到一定的深度,在深度学习的时候,主动学习相关的技术点,广度也得到拓宽。 你需要学会的编码习惯 程序员应该学会通过技术的手段来提高效率。几个常用的手段是使用工具,快捷键和编写脚本。 使用各种工具 技术人员电脑尽量用MAC,使用命令行效率一定比在 10241024 像素中找一个 1010 像素的按钮更快。IDE用IDEA,比Eclipse更智能。命令行工具用iTerm和IDEA里的Terminal。写文章用MAC的客户端工具MacDown,左边编写,右边展示,比Word等工具方便快速很多。有时候我还会用按键精灵里配置脚本需要解决工作问题,比如通过点击我们的系统,来执行任务。这样的工具很多,只要能提高工作效率的工具,大家都可以尝试使用。 使用快捷键 MAC,IDEA和Eclipse有很多快捷键都要学会使用,比如在MAC命令行中通过idea .快速打开工程,通过open . 快速的打开文件夹,把IDEA里通过快捷键把一段代码抽成一个单独的方法,快速生成getter setter方法。 用脚本写工具 当我们用人工的方式做一件重复性很强的事情,首先要考虑使用工具来帮我们自动完成,如果没有类似工具,可以自己写个脚本来实现,这样除了能快速解决问题,还能提高自己的技术能力。 比如,我经常要在两个maven仓库发布jar包,我就写了个脚本来实现jar包的发布, deploy.sh代码如下: cp pom.xml pom.xml.bakrm pom.xmlln -s pom-2-deploy.xml pom.xmlmvn deployrm -rf pom.xmlcp pom.xml.bak pom.xmlrm pom.xml.bak 在业务团队做开发如何成长 我一直在业务团队中做开发,在业务团队最主要的提高的能力是业务抽象和架构能力,通过业务场景,不断思考如何通过合理的架构和业务抽象能快速支持业务,降低运维成本。同时在这个过程中锻炼技术能力,比如写一些技术框架来快速支持业务,做到技术驱动业务。 可配置化的方式支持业务 设计业务的领域模型,把不随着业务逻辑变化的领域模型做成系统能力,把随着业务逻辑变化功能,做成可配置化,上一个新业务,通过配置的方式或少量开发就能支持。 在做客户后台功能时,由于需要展示的数据种类非常多,每种数据展示可能需要花费几天的时间,所以设计了一个通用的技术框架,实现了通过配置化的方式展示各种数据。 写框架解决业务问题 我在上家公司经常做一些CRUD的业务功能,我就自己开发了一个快速做CRUD的框架 jdbcutil,通过配置实体生成SQL语句,实现了子类只要继承父类,就自动拥有CRUD的能力。后面还写过生成CRUD页面代码的程序。 目前我们团队在做的TITAN框架通过模块化开发的方式,解决易变的业务系统在多人开发时遇到的问题。 技术驱动业务 在业务团队,一定要不断的思考如何利用技术来支持快速支持业务,配置化是一种思路,但是有些功能配置复杂度比较高,配置加验证的工作量,可能需要一个星期的时间,那么能不能减少人工配置,实现系统自动化配置,于是可以研究下人工智能,通过人工智能的方式实现,系统告诉人需要配置哪些东西,然后交给人来进行确认,这样可以大大减少人工成本,更快的支持业务。 1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。 2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。 3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。 4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。 5.群号:532259952 里面可以学习和交流,也有资料可以下载6.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

优秀的个人博客,低调大师

2017年数据架构师架构选型必读

这是最好的时代,科学技术推陈出新,各种数据库不再一家独大,关系数据库、非关系数据库(NoSQL)、混合数据库(NewSQL)各领风骚。 这也是最坏的时代,琳琅满目的数据库名称和特性,让我们目不暇接。一个个去研究显然时间和精力有限,随大流选一个却又担心走到坑里去,沉没成本太大。 刚好这又冬去春来,适合大兴土木大搞建设的时候到了,这里就来跟大家捭阖下。 首先还是要有个基准的判断,这个业务系统,是选用关系型数据库呢,还是非关系型数据库?是偏OLTP类型呢还是更加偏OLAP类型? 如果是选择传统关系型数据库,通常就只建议在这四个数据库里选择了。 Oracle虽然一直在掉分,而且分数被MySQL拉得很近,但是大家需要注意的是,这个分值并非代表使用的公司的多少,也不代表使用的套数或者数据量的大小,而主要因素是“热度”,这东西跟股市有点差不多,供参考但不能依赖。 DBAplus Newsletter第二期中是这么解读的:“其实这么看上去第一集团还是Oracle / MySQL / SQLServer,PG在快速追赶中,目前离第一集团大概还有3~4倍左右的差距,但PG作为这几个老牌数据库中斜率比较大的,大概在2013年年底有一个跳变,看时间点应该是PG 9.3的发布,随后PG一直保持了非常稳健的向上发展趋势,这个表现非常符合最近几年PostgreSQL社区的快速发展,从9.0到去年的9.6,PG面向传统企业、互联网、金融、物联网、政企等行业发布了诸多特性,在SQL兼容性与时俱进,贴近最新发布的SQL标准,从社区发布的性能测试来看,单机TPS达到了180万的水准。PostgreSQL正在以自己的方式构建一个庞大的生态体系。这个数据也是比较符合直观感受的。” 那么,具体要怎么选择呢?如果你是个新鲜的互联网公司,而且也有钱找得起高工资的DBA有能力控制好开发质量,那么不用多说,选择开源数据库吧,MySQL或者PG。如果JSON类LBS业务用得非常多,用PG吧,否则可以用MySQL。 选用MySQL,一个重要的新组件暂时还不推荐上:MySQL 5.7.17 Group Replication。从官方的性能测试结果看,性能是优于Galera PXC的,接近异步同步。但是目前在运维方面的支持上不够好,比如备份和集群客户端支持上,离实际生产环境大规模应用还是有一段距离。 如果你其实也不知道开发团队会设计出些什么架构,写出些什么代码,对开源数据库的特点也基本没太多经验,那么选Oracle或者SQL Server吧。业务量很大,优选Oracle,否则SQL Server也是可以的。后者几乎是“免维护”的,至少不太请专职DBA。 当然,优先推荐的当然是Oracle,因为12cR2已经发布了。浦发银行2017年的新项目全部采用12cR2,当然肯定是要用集群,肯定是要用PDB,肯定是要用IMO,这些技术在吉林移动、浙江移动都在核心生产上跑了好长时间了。是的,R2新出的Sharding还在考量中,虽然看起来很美。 MongoDB现在用的也非常多,曾经一度热度超过了PG。目前看起来还是以互联网应用为主,社群今年会有许多线下沙龙,可以多参加了解。 国内数据库,我们相信是绝大多数人心中的痛。这个其实也没办法,婴儿学步总要有个时间。 在Newsletter第二期有5家国产数据库发布了新的产品消息: 蚂蚁金服的OceanBase 1.0可申请试用 TiDB将发布RC2 达梦发布DM v7.1.5.145 巨杉数据库发布SequoiaDB 2.6社区版 南大通用发布GBase UP 原文发布时间为:2017-02-25 本文来自云栖社区合作伙伴DBAplus

优秀的个人博客,低调大师

DevOps:软件架构师行动指南DevOps:软件架构师行动指南2.3 独特的云特性对DevOps的影响

2.3 独特的云特性对DevOps的影响 云影响DevOps的3个独特特性是简单地创建和切换环境的能力;轻松创建虚拟机的能力,以及数据库的管理。我们首先讨论环境。 2.3.1 环境 在我们的上下文中,环境是足够执行软件系统的一组计算资源,包括所有支持软件、数据集、网络通信,以及执行软件系统所需定义的外部实体。 这个定义的关键点是:除了明确定义的外部实体外,环境是自包含的。一个环境通常独立于其他环境。在第5章中,我们会看到一些环境,例如开发、集成、用户测试,以及生产环境。在第12章的案例研究中,环境的生命周期是其部署流水线的一部分。在开发、测试和部署过程的各阶段有多个环境并不是云独有的特性,但简单地创建和迁移环境的能力是云独有的特性——像克隆新实例一样容易。通过使环境之间没有可修改的共享资源来实现一个环境与另一个环境的隔离。只读资源,例如各

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册