West Ham Prepara Oferta De R$ 90 Milhões Por Gabigol, Diz Jornal
O Flamengo pode ganhar um rival de peso na briga por uma extensão de contrato do atacante Gabigol. Segundo o...
O Flamengo pode ganhar um rival de peso na briga por uma extensão de contrato do atacante Gabigol. Segundo o...
Sem acordo com o núcleo gestor do Cruzeiro, o atacante Fred acionou o clube na Justiça pedindo rescisão indireta do vínculo de trabalho. A Raposa...
A Coreia do Sul será o primeiro país que paralisou o futebol por conta da pandemia do novo coronavírus a...
A partir desta segunda-feira (6), estudantes de baixa renda já podem solicitar isenção da taxa de inscrição do Exame Nacional...
O Twitter informou nesta quinta-feira (2) que removeu milhares de contas no Egito, Arábia Saudita, Honduras, Indonésia e Sérvia, que supostamente...
Xand Avião anunciou na quarta-feira, 1, que fará um show no próximo sábado, 4, às 16h, numa live transmitida no...
O Parnahyba começou o mês de março com o pé direito. Nesse domingo (1), O Tubarão venceu o Picos por...
O presidente dos Estados Unidos Donald Trump ameaçou nesta 4ª feira (15.abr.2020) forçar o Congresso entrar em recesso caso os...
前面有一篇文章中提到过开源软件,不过主要是在系统运维的角度去讲的,主要分析一些系统级的开源软件(例如bind,memcached),这里我们讨论的是用于搭建初创网站应用的开源软件(例如phpbb,phparticle),运行在Linux,MySQL,Apache,PHP,Java等下面。 创业期的网站往往采用比较简单的系统架构,或者是直接使用比较成熟的开源软件。使用开源软件的好处是搭建速度快,基本不需要开发,买个空间域名,下个软件一搭建,用个半天就搞定了,一个崭新的网站就开张了,在前期可以极大程度的节约时间成本和开发成本。 当然使用开源软件搭建应用也存在一些局限性,这是我们要重点研究的,而研究的目的就是如何在开源软件选型时以及接下来的维护过程中尽量避免。 一方面是开源软件一般只有在比较成熟的领域才有,如果是一些创新型的项目很难找到合适的开源软件,这个时候没什么好的解决办法,如果非要用开源的话一般会找一个最相似的改一下。实际上目前开源的项目也比较多了,在sf.net上可以找到各种各样的开源项目。选型的时候尽量应该选取一个程序架构比较简单的,不一定越简单越好,但一定要简单,一目了然,别用什么太高级的特性,互联网应用项目不需要太复杂的框架。原因有两个,一个是框架复杂无非是为了实现更好的可扩展性和更清晰的层次,而我们正在做的互联网应用范围一般会比开源软件设计时所考虑的范围小的多,所以有的应用会显得设计过度,另外追求完美的层次划分导致的太复杂的继承派生关系也会影响到整个系统维护的工作量。建议应用只需要包含三个层就可以了,数据(实体)层,业务逻辑层,表现层。太复杂的设计容易降低开发效率,提高维护成本,在出现性能问题或者突发事件的时候也不容易找到原因。 另外一个问题是开源软件的后期维护和继续开发可能会存在问题,这一点不是绝对的,取决于开源软件的架构是否清晰合理,扩展性好,如果是较小的改动可能一般不会存在什么问题,例如添加一项用户属性或者文章属性,但有些需求可能就不是很容易实现了。例如网站发展到一定阶段后可能会考虑扩展产品线,原来只提供一个论坛加上cms,现在要再加上商城,那用户系统就会有问题,如何解决这个问题已经不仅仅是改一下论坛或者cms就可以解决了,这个时候我们需要上升到更高的层次来考虑问题,是否需要建立针对整个网站的用户认证系统,实现单点登录,用户可以在产品间无缝切换而且保持登录状态。由于网站初始的用户数据可能大部分都存放在论坛里,这个时候我们需要把用户数据独立出来就会碰到麻烦,如何既能把用户数据独立出来又不影响论坛原有系统的继续运行会是件很头痛的事情。经过一段时间的运行,除非是特别好的设计以及比较好的维护,一般都会在论坛里存在各种各样乱七八糟的对用户信息的调用,而且是直接针对数据库的,这样如果要将用户数据移走的话要修改代码的工作量将不容忽视,而另外一个解决办法是复制一份用户数据出来,以新的用户数据库为主,论坛里的用户数据通过同步或异步的机制实现同步。最好的解决办法就是在选型时选一个数据层封装的比较好的,sql代码不要到处飞的软件,然后在维护的时候保持系统原有的优良风格,把所有涉及到数据库的操作都放到数据层或者实体层里,这样无论对数据进行什么扩展,代码修改起来都比较方便,基本不会对上层的代码产生影响。 网站访问速度问题对初创网站来说一般考虑的比较少,买个空间或者托管服务器,搭建好应用后基本上就开始运转了,只有到真正面临极大的速度访问瓶颈后才会真正对这个问题产生重视。实际上在从网站的开始阶段开始,速度问题就会一直存在,并且会随着网站的发展也不断演进。一个网站最基本的要求,就是有比较快的访问速度,没有速度,再好的内容或服务也出不来。所以,访问速度在网站初创的时候就需要考虑,无论是采用开源软件还是自己开发都需要注意,数据层尽量能够正确,高效的使用SQL。SQL包含的语法比较复杂,实现同样一个效果如果考虑到应用层的的不同实现方法,可能有好几种方法,但里面只有一种是最高效的,而通常情况下,高效的SQL一般是那个最简单的SQL。在初期这个问题可能不是特别明显,当访问量大起来以后,这个可能成为最主要的性能瓶颈,各种杂乱无章的SQL会让人看的疯掉。当然前期没注意的话后期也有解决办法,只不过可能不会解决的特别彻底,但还是要吧非常有效的提升性能。看MySQL的SlowQuery Log是一个最为简便的方法,把执行时间超过1秒的查询记录下来,然后分析,把该加的索引加上,该简单的SQL简化。另外也可以通过Showprocesslist查看当前数据库服务器的死锁进程,从而锁定导致问题的SQL语句。另外在数据库配置文件上可以做一些优化,也可以很好的提升性能,这些文章在网站也比较多,这里就不展开。 这些工作都做了以后,下面数据库如果再出现性能问题就需要考虑多台服务器了,一台服务器已经解决不了问题了,我以前的文章中也提到过,这里也不再展开。 其它解决速度问题的办法就不仅仅是在应用里面就可以实现的了,需要从更高的高度去设计系统,考虑到服务器,网络的架构,以及各种系统级应用软件的配合,这里也不再展开。 良好设计并实现的应用+中间件+良好的分布式设计的数据库+良好的系统配置+良好的服务器/网络结构,就可以支撑起一个较大规模的网站了,加上前面的几篇文章,一个小网站发展到大网站的过程基本上就齐了。这个过程会是一个充满艰辛和乐趣的过程,也是一个可以逐渐过渡的过程,主动出击,提前考虑,减少救火可以让这个过程轻松一些。
ICE(Internet Communications Engine)是ZeroC提供的一款高性能的中间件,基于ICE可以实现电信级的解决方案。前面我们提到过在设计网站架构的时候可以使用ICE实现对网站应用的基础对象操作,将基础对象操作和数据库操作封装在这一层,在业务逻辑层以及表现层(java,php,.net,python)进行更丰富的表现与操作,从而实现比较好的架构。基于ICE的数据层可以在未来方便的进行扩展。ICE支持分布式的部署管理,消息中间件,以及网格计算等等。 大道理讲完,言归正传,最近育儿网新增了不少新服务,服务间经常会需要相互调用数据,例如用户中心要取博客系统里的文章啊,论坛里发文后要在积分系统里增加用户积分啊。由于设计时这些服务仅仅基于统一的用户中心,服务间基本是独立的,所以要实现这些调用只能在每个服务上新增为其它服务提供服务的服务-_-!。这个时候有几个可选方案,我们开始选择了xml-rpc,基于http和xml的选程调用,用了一段时间,发现维护成本和访问性能都存在问题。 由于这些中间服务部署的时候是和各自所属的服务部署在一起的,对这些服务做整体的改动就非常困难,要维护起来就比较麻烦。另外由于是什么http和xml作为通信协议,由php实现业务逻辑,性能问题也很明显,而且这些http请求都会在http日志留下足迹,导致我们的日志分析很不精确。这个问题不是太大,但很郁闷,所以我们考虑使用ICE来解决这个问题,至于SOAP什么的就不考虑了,同样效率低下。 实现的过程还是比较顺利,花了三天的时间用c++实现了大部分常用的接口,服务端采用deamon的方式运行,错误日志记在syslog里(/var/log/messages),客户端PHP,编译进去了IcePHP,调用的方法很简单。现在还存在一些问题,运行的时候会异常退出,还需要一段时间来解决,暂时加了只狗看着,一旦进程里没了就重新启动。 既然要跨平台通讯,就涉及对象描述,ICE使用Slice来对结构,类,方法等进行定义。完了以后服务器端,客户端都按这个来调用和实现。ICE内置的Linux 下后台Deamon实现方案非常简单,只需要从Ice::Service里派生出一个类来,实现run方法,在这个方法里创建adapter对象,并在adapter对象里添加Servants,然后激活这个adapter就可以了,网络层的通信都由ICE接管了。由于是基于tcp/ip的直接通信,比更高层的http通信效率要高很多。 在客户端实现时,我们也碰到了一些小麻烦。一个是内置的$ICE对象用的时候有时需要用global声明,否则可能会出错,另外由于默认情况下Slice中struct对应到php的类型是一个类的实例,而不是一个数组,所以在赋值给页面的时候,smarttemplate以及其它模板系统中可能都会存在问题,可以通过修改模板系统的数据赋值显示代码解决。 我们做了一些性能的测试,同样运行1千次请求,使用xml-rpc实现需要28秒左右,使用ICE实现,只需要3秒多,性能的差距还是很大的,同时在这个过程中没发现有内存泄露的情况,效果还比较理想。 最后感慨一下,ICE是适合人类使用的中间件!
O Goiás Vôlei inicia neste sábado (4) um dos maiores desafios da temporada: encarar o poderoso Sada Cruzeiro pelas quartas...
O brasileiro Hugo Calderano volta à mesa neste sábado (4) para um confronto decisivo pelas quartas de final da Copa...
Na noite desta quarta-feira (01/04) Goiás e Londrina empataram em 2 a 2 em jogo equilibrado no VGD, pela Série...
Uma operação de busca e salvamento mobilizou equipes do Corpo de Bombeiros Militar de Goiás após o desaparecimento de uma...