一篇帖子转过来大家看看—听说12306ng.org是技术大牛建立
郭辉
2023-12-01
今天, 又一片脑残的12306的文章上了CSDN首页, 哥哥一看, 全是弱智的新手的自以为是的人写的, 这些人的特点是, 不敢写真实详细的步骤, 只敢泛泛而论,全是废话
.而且此新手是搞windows平台的新手, 因为只有微软的新手才会如此狭隘,没眼界, 同样是java新手, java新手的眼界要开阔的多.
哥提了一点显而易见的意见, 竟然有微软新手来说哥说的太容易, 还说12306ng.org是技术大牛建立的.
来, 让我们看看12306ng.org上的大牛的真实水平:
一、前端负载均衡
通过DNS的负载均衡器(一般在路由器上根据路由的负载重定向)可以把用户的访问均匀地分散在多个Web服务器上。这样可以减少Web服务器的请求负载。因为http的请求都是短作业,所以,可以通过很简单的负载均衡器来完成这一功能。最好是有CDN网络让用户连接与其最近的服务器(CDN通常伴随着分布式存储)。(关于负载均衡更为详细的说明见“后端的负载均衡”)
------
这哥们连DNS是什么, WEB服务器是什么都没分清楚, DNS服务器你能控制的了吗? 重要的DNS服务器都在美国, 你能让美国人给你专门解析? 再个, 在公网, DNS解析的只能是公网IP, 你还DNS负载均衡, 你难道想让你的Web服务器直接工作的公网IP上?
业内典型的做法是, 有钱的购买思科的赢家复杂均衡解决方案, 贵但是效率非常高, 一台就够用.
抠门又有点技术的, 用LVS负载均衡, 这个玩意还是中国的一个人搞的, 目前在淘宝工作, LVS是Linux上负载均衡的说是标准.
没钱又没技术含量的,用nginx在应用层做负载均衡.
不多说,12306ng.org上的"大牛"不懂的自己出查查资料.
二、减少前端链接数
目前打开12306主页,需要建60多个HTTP连接,车票预订页面则有70多个HTTP请求,现在的浏览器都是并发请求的。所以,只要有100万个用户,就会有6000万个链接,太多了。一个登录查询页面就好了。把js打成一个文件,把css也打成一个文件,把图标也打成一个文件,用css分块展示。把链接数减到最低。其中css和js文件也将压缩后发布!
-----------------
"大牛"这个地方看来是一知半解啊, 第一条刚说了用CDN, 第二条就忘了, 虽然减小js/图片/css等静态文件的数量是一个可行办法, 但是也不能合并的太厉害, 别忘了还有一个复用的问题, 好比数据库设计, 不能把全部数据都放一个表里.
浏览器对一个域名同时发起的连接数是有限制的, 并且静态文件不是WEB服务器的长项, 所以使用另个一域名的CDN存放js/css/img是业界常用的一个方法.
三、减少网页大小增加带宽
这个世界不是哪个公司都敢做图片服务的,因为图片太耗带宽了。现在宽带时代很难有人能体会到当拨号时代做个图页都不敢用图片的情形(现在在手机端浏览也是这个情形)。目前12306页面上所有的图片都是和网站程序放在一个服务器上,这个很影响网站程序的带宽,建议把图片独立出来单独放到一个服务器!
-----------------------
还把图片单独放一个服务器, 这也是自己想出来的吧. 说白了还是CDN的问题, 看来"大牛"真的是对CDN一知半解.
四、前端页面静态化
静态化一些不常变的页面和数据,并gzip一下。还有一个并态的方法是把这些静态页面放在/dev/shm下,这个目录就是内存,直接从内存中把文件读出来返回,这样可以减少昂贵的磁盘I/O。
---------------
现在软件开发都是分工合作, 各司其职的, "大牛"看来还停留在什么事情都是程序来做的阶段.
页面静态化是必须要做的, 但是不是由程序员来做, 而是应该由运维来做, 比如每个网站的首页, 访问量非常高, 而且很多都不是看那个首页,只是访问这个网站时,必须打开的.
首页静态化是必须的.但是这个得由运维做, 有些页面不经常改变, 也应该静态化, 可以使用运维工具自动生成静态首页的方式, 也可以使用nginx, squid等软件的静态缓存功能.
五、优化查询
很多人查询都是在查一样的,完全可以用反向代理合并这些并发的相同的查询。这样的技术主要用查询结果缓存来实现,第一次查询走数据库获得数据,并把数据放到缓存,后面的查询统统直接访问高速缓存。为每个查询做Hash,使用NoSQL的技术可以完成这个优化。(这个技术也可以用做静态页面)
对于火车票量的查询,个人觉得不要显示数字,就显示一个“有”或“无”就好了,这样可以大大简化系统复杂度,并提升性能。
-----------------
"大牛"的这一条蜻蜓点水的扯了好几个技术, 说白了还是因为一只半解, 说不出所以然才一笔带过.
对优化查询这个问题, 除了技术自己数据访问功力深厚外, 还是运维\DBA 等人的事情. 要知道现在的DB都很智能(SQL Server除外), 能够记录统计信息, 然后根据表和查询的统计信息更改执行计划,来达到最优的查询效率.
"大牛"还提到一个缓存问题. 缓存直接用memechace, redis等实现就好了, 没必要还hash自己实现一个. 而且, 要注意, hash的目的是找到该条数据所在的"哈希桶", 而不是找到该条数据的位置, 使用hash来判断两个值是不是相等是错误的, 因为会存在不同的两个值有相同的hash值的情况.
六、缓存的问题
缓存可以用来缓存动态页面,也可以用来缓存查询的数据。缓存通常有那么几个问题:
1)缓存的更新。也叫缓存和数据库的同步。有这么几种方法,一是缓存timeout,让缓存失效,重查,二是,由后端通知更新,一但后端发生变化,通知前端更新。前者实现起来比较简单,但实时性不高,后者实现起来比较复杂 ,但实时性高。
2)缓存的换页。内存可能不够,所以,需要把一些不活跃的数据换出内存,这个和操作系统的内存换页和交换内存很相似。FIFO、LRU、LFU都是比较经典的换页算法。相关内容参看Wikipeida的缓存算法。
3)缓存的重建和持久化。缓存在内存,系统总要维护,所以,缓存就会丢失,如果缓存没了,就需要重建,如果数据量很大,缓存重建的过程会很慢,这会影响生产环境,所以,缓存的持久化也是需要考虑的。
诸多强大的NoSQL都很好支持了上述三大缓存的问题。
----------
"大牛"终于提到缓存问题了. 不过大牛又犯了小农程序员的毛病, 又开始扯什么缓存更新, 缓存置换算法, 缓存持久化问题.
首先这些问题, 成熟的缓存软件已经做好了, 你不需要自己实现, 就是你自己实现,那老板也不同意.
缓存问题没什么可谈的,就那么几个有效的解决方案.
哥哥顺便说一下哥的看法.
首先程序之外, 很多人以为小公司牛人多, 一个人是大拿, 什么都能干, 大公司的人都是分工细, 一个人什么都干不了.
其实不然, 小公司的大拿所谓的本事,忽悠新手还可以, 真正拿出他做的东西来评审, 初级阶段都通过不了. 这就是为什么很多有实力的公司招聘很多人, 分工很细的原因. 软件开发本来就是一件昂贵,娇贵, 成本高, 难度大的事情, 你一个大拿就解决了软件危机? 那只是无知!
再个, 这样的订票系统, 除了要在Web层解决高并发访问之外, 还有一个业务交易的问题.
前台用门户网站方案解决高并发问题, 把任务批量提交个后端业务处理服务器, 批量完成票据的买卖和资金通银行的交易.
所以说, 任何高并发系统, 不可能是一个实时系统, 世界上根本不存在任何实时系统, 只有延迟的时间长短问题.
你一点购买按钮, 0.1秒后, 网页提示你购买成功, 这是交易, 你点一下购买按钮, 5分钟, 5小时候, 程序才告诉你交易成功和失败, 这是相同的.
提高交易类程序效率的办法, 最根本就是批量提交, 除此之外没别的方法
数据库导入更新数据, 采用批量提交方法提高效率, 操作系统提高效率也是采用批量提交数据到内核空间让内核处理的方法.
所以,各位微软的奴才, 还是回去看看基础, 看看微软之外的世界, 微软是一个大祸害啊, 计算机软件技术, 自从你们出生之前就没什么进步,微软的新技术那只是封装, 不是新技术.
可怜那些口口声声说"喜欢学习新技术的"傻子了, 哥还真听到过微软的开发顾问说有的应聘者还真这么说过, 真是中了比尔盖茨的计了.