五千年(敝帚自珍)

主题:【原创】好吧,给一个铁道部订票系统的正确答案 -- 布老虎

共:💬185 🌺732 🌵9
分页树展主题 · 全看首页 上页
/ 13
下页 末页
        • 家园 我只是挖个坑就通宝推啊。。。

          搞的我都不好意思了,本来想坑掉都不行了。

          ========================================

          简单说下我以前参与的那个系统:一个商品秒杀系统,每次来访问的用户人数都比较多,带宽与服务器的压力都很巨大。这个系统虽然设计实现的比较堍,但却管用。

          当然我们的系统与铁道部订票的系统没法比,因为我们为了抗访问压力,将前面的业务逻辑尽量简化。

          总结起来,对这类系统就是这么几点:

          1. 不能追求完全的精确。任何一个抢购系统都会有些全局的资源,比如车票、座位、商品。要控制抢购的数量,不能超卖,这是起码的要求,但这个要求不能僵硬的执行。要做到实时数字的完全准确,就会对性能造成极大的影响,甚至会造成整个系统瘫痪。

          2. 第一层抗访问压力的逻辑要简单再简单。用户来了,访问一个哈希表(我们用的Redis),看看这个用户有没有已经买过,if买过了就返回跳走,else没买过,就看下商品资源是否有货的标志,if没有货就返回卖光了的标志给客户,else恭喜成功记一条syslog出去。ok了,前面一层只有这点逻辑。

          3. 尽量异步化。上面说了,前面记条日志就返回了,每个请求没有什么阻塞的时间。后台有个程序会把这些日志汇总到一个中心服务器里,那个中心的服务器会记录总数,并把信息写入到Redis的主库里。这样,整个抢购过程中,只有一个连接在写Reids,剩下的都是简单的读取。

          总之,举重若轻,越是看上去困难复杂的问题,越要用简单的方法解决。当然,像美国医保网站那样复杂的系统搞5亿行代码,也是必须的。

          • 家园 他是总统啊,通宝多不胜数

            抓住行家问几个问题:

            1. 高峰期有多少人同时在线?

            2. 用了几台服务器?

            3. 用了什么数据库?

            4. 用什么开发UI?

            5. 需要多少带宽?

            • 家园 行家谈不上,在不涉密的情况下简单回复下

              抓住行家问几个问题:

              --- 行家谈不上

              1. 高峰期有多少人同时在线?

              --- 几个M

              2. 用了几台服务器?

              --- 30台左右

              3. 用了什么数据库?

              --- Redis

              4. 用什么开发UI?

              --- HTML

              5. 需要多少带宽?

              --- 几个G


              本帖一共被 1 帖 引用 (帖内工具实现)
    • 家园 好吧,和完稀泥打屁股

      个大五十大板之前,先拍拍马屁,让你们不要觉得那么痛。

      整栋楼里,有两个跟技术无关的观点我非常欣赏:

      第一个是布老虎提出的要预付款,才能买票,这个可以从战略上有效扼制黄牛党。

      第二个是红黑客提出的企业级数据库的说法,以我对国企的观察,任何采购,都必须有人要负责,一般来说,象Oracle,IBM这样的供应商,机会大很多,理由是,出了事,可以找人做售后支持(难听一点,就是找人背锅)。提出这个说法,说明红黑客的政治敏感度很高。

      要打老虎屁股的有几点:

      其一,是他对.Net的蔑视。我就举个例子吧,澳洲4大银行之一的Commonwealth Bank的网银, 就是用asp.net开发的,200多万用户吧,他们分行的客户管理系统叫CommSee,用C#开发的,应该至少也有好几万个用户吧。

      至于他说的这句话:

      .net程序员普遍存在的问题,就是微软把很多底层的东西掩盖住了,结果对系统理解的水平差很多,把问题简单化到了极点。

      我要摸摸虎头,说,老虎,你没看过这几本书吧?

      Essential .NET, Volume I: The Common Language Runtime (Don Box , Chris Sells)

      The Common Language Infrastructure Annotated Standard (James S. Miller, Susann Ragsdale)

      Inside Microsoft .Net Il Assembler

      by Serge Lidin

      (我承认,我只看过第一本,获益非浅,呵呵)

      其二,他批评红黑客讲政治,不讲技术。这说明他对国企,尤其是铁路这个级别的央企缺乏理解,到了这个级别国企,100%是先讲政治,再谈技术,他完全不知道,能够拍板的人,对采用哪种技术,是7窍通了6窍的。

      要打红黑客的屁股,主要是他过于贬低开源数据库的能力,我个人认为MySQL经过这么多年的发展,应该算是相当成熟的了。虽然,要说服铁路部门用,估计不大可能,从技术上讲,我认为还是堪当重任的。

      好吧,最后说说本厨的看法:

      1. 搞开发,跟厨师烧菜差不多,能否做一份好菜上桌,主要看厨师。搞这个订票系统,主要就看铁路的IT部,是否人强马壮。从之前的系统来看,大家就不要对这个厨师有太大的期望了。

      2. 我怀疑最终会外包出去,国内几家,腾讯,淘宝,百度等,都有技术能力。讲政治的话,未必会直接外包给Oracle,IBM。配合支付的话,我觉得几大银行也可以胜任。

      3. 开源的东西,不是不能用,但要省这个钱,不容易,没有强而有力的技术团队支持,很容易得不偿失。

      4. 天马行空的话,还有一个省钱的办法,能否移植一下国内的内陆机票订票系统呢?

      好了,说完了,准备挨砖头了。。。

    • 家园 我老集中批判一下

      前段时间工作实在太忙,只能抽空零零星星地反驳。铁手说少骂人,以理服人。今天周末,我老作为国内青年码工的思想导师,对当前的一些现象深恶痛绝。我觉得这些丑恶现象集中体现在了红黑客的帖子里,好吧,我老以理服人,特批判如下。

      首先要提的,就是技术水平的低下。 我估计此人是.net程序员。

      作为一个码工,居然能说出 "事实上,根据我在开源世界十多年的经验,开源产品虽然创意足够多,但真正能够保证质量,懂得业务的产品几乎没有。"这样的话,这一听就是从来没有干过正经开发的,估计此人平时工作就是堆业务逻辑。软件开发(懂这个词吗?)和做应用写业务逻辑程序完全不一样。铁道部的问题,是需要进行软件开发,而不仅仅是应用开发。你明白这里面的区别?

      别的不说,你知道不知道Java就是开源软件?你平常写程序应该不是用的Java,估计应该用的是.net之类拉拉控件的弱智玩意。你如果用java,不可能不用Eclipse,不可能不经常下载升级,不可能不知道Eclipse就是开源软件,基本上是Java开发的唯一工具(netbeans不提了)。你对开源毫无概念,所以应该是做.net的。

      开源软件对于闭源软件的优势,是无可比拟的。你TM到底知道不知道开源软件的优势在哪里?为什么那么多的公司偏好开源软件而不是闭源软件?(以下培训,我老就不收费了)因为开源软件免费,有无数的用户使用,错误发现快,纠错快。公司里的高手还可以Code Review,跟踪JIRA,甚至提交patch和feature来影响软件方向,这和自己开发没区别,省了很多力气。你到底懂不懂?闭源软件,你要是大公司还差不多,小公司的就免谈了。即使像微软这样的大公司,数千码工,做出来的东西(IE为例)还是跟狗屎一样,没法和FF/Chrome比。Java如果不是开源,有那么多的高手在JCP,根本无法取得现在的地位。就这样,还闹出来很多笑话,比如EJB之类。

      不要神神秘秘地拿什么Java先进技术没法解决高峰响应问题来举例子,这明显是隔行如隔山的提法,你以为这说明了.net比java厉害?5分钟能发现的问题你们拖了两年多没法搞清楚,这就是技术低下的证明,并不能证明.net比java性能好。Java在大数据上的应有是微软无法相比的。

      .net程序员普遍存在的问题,就是微软把很多底层的东西掩盖住了,结果对系统理解的水平差很多,把问题简单化到了极点。有一个猪一样的队友(或者干脆就是马甲),说“免费方案中,红黑客会选开源中最好的PostgreSQL”。你就那么肯定? 先不说这哥们根本不懂开源软件是什么意思, 你以为铁道部问题的解法(或者“方案”,就是简单地数据库存取?你以为就是简单地选哪个数据库的问题,结果全国人民都搞复杂了,就你一针见血?选对了数据库,得永生?选错了,就完蛋?你以为这就是一行程序的问题?

      那我TMD写那一大篇干什么?Google搞MapReduce/Spanner是吃饱了撑的?Amazon做Dynamo是为了好玩?java的解法是绕过数据库解决流量瓶颈问题,这点你是完全没有办法理解的,因为这需要对transaction(国内叫事物,应该翻译成交易)有深刻的理解,知道很多情况下可以放松ACID的限制,不会出现问题。你的问题就是不知道ACID到底要达到什么目的,不理解ACID也可以放宽,只知道简单地机械地套公式。存钱取票?好,那就数据库,才能保证ACID。至于为什么一定要ACID,不知道,洋大人说的,那还有错?

      我老指出了message queue的方法,你终于理解了这个challenge,赶紧补上一个什么spooling。我不知道你从哪里google来的什么spooling,从来没听说过,是不是又是microsoft .net的shit?

      其二,技术水平的低下,只会简单机械地套公式结论,导致了不可知论,和因此引致的恐惧,自卑,讲政治不讲技术。

      你的主要论点是政治责任,只要用了开源,出了事就有责任。这几句稀里糊涂的话,我老听了,也是稀里糊涂。这软件的东西,我老给各位小的们介绍一下,是deterministic的,知道这个词吗?就是确定性。出了事?具体说说,这个系统会出什么事?啥时候出事?你连这个都没搞明白,你敢把系统放上线?尼玛人吓人,吓死人。

      任何一个,注意,任何一个,有一点SLDC经验的程序员,都可以随时指出这个问题。最基本的常识步骤,是这样的大系统,应该有QA和release的计划,很简单地举个例子,比如首先可以只卖郑州始发,观察系统性能,然后加上北京始发,然后加上广州始发,然后一步一步推广到全国。哪里有什么不可预见的事件?哪里来的恐惧感?这恐惧感,完全是愚昧导致的,除此没有别的解释。你提到的那些big bang release的做法,倒是很像铁道部的傻叉们的手笔。老实招了吧,铁道部的那个down机的系统,是不是就是你那一行程序连到数据库干出来的?

      我还不明白的一点,就是推给厂商为什么就可以没有责任?这里面的潜台词是不是,你看,洋大人都没有办法解决的问题,我当然也没有办法。这样的说法也能过关?我老真是服了。国内那么多年了,还是那套第三世界国家的自卑思维。美国这里,可没有什么洋大人,Oracle down机了,你一样要负责,怎么可以推到厂商就可以免责?厂商也是你选的吧?你选了一个问题厂商,你可以不用负责?或者这个厂商的系统没用好- 比如只能支持几百个并发,你给老子搞了几十万个并发,你可以没责任?这边trader一句话,老子blow off tons of dollars on techology,你他妈的就得给我保证好。老子不听excuse。

      最后,对铁道部业务的错误理解,导致了错误的技术选择。我老看来看去,就是铁路票控计划部门每天把票输进系统,大家抢票,有啥滚过来滚过去的事务难题?你为什么会觉得这是个难题?这么基本的业务流程都能搞错?

      我老的结论,就是国内程序员要有自尊心,要研究底层技术和上层系统技术,不能满足只是堆代码。要脱离.net,加入java, 不要有偷懒依赖,天塌下来有高个子挡着的第三世界国家的心理。另外就是微软实在害人不浅。

      最后,在你的帖子里隐隐约约,但是反复提到我老的建议价格,也就是2000万美刀,太低。要不,你就是那个铁道部选的供应商?说吧,你报了多少?一个亿美刀?给我老一点回扣,我老就高抬贵手了。

      通宝推:墨虎,
      • 家园 顶一下你写的内容

        红黑客网友其实就是典型的自以为懂开发或者工程,其实就一别人产品的一用户水平。我一看到哪个什么三元悖论就直接呕吐了。。。就铁道部这个东西,选了技术方案架构搞不定了就来个悖论,这不是废话么:条件都给定了,当然就悖论了。

        我也给一些低水平的货上上计算机体系架构和组成原理的课吧。

        高访问量这玩意,应该找的东西不叫悖论,叫瓶颈,啥瓶颈?数据库!为啥?因为是硬盘!咋解决?在内存里搞!咋搞?布老虎给了答案。

        红黑客一类的网友开口闭口懂业务,其实他们还真不懂业务。从宏观上看,恰恰就是因为这种"懂业务"的人太多了,才轮得到哪些通用企业信息系统(erp, crm, finace ...)卖大价钱. 他们其实只知道把自己会搞的东西叫业务,对业务本身,对技术就却是一知半解,理解不深刻。否则早就自己开发各种 通用的 和 专用的 信息系统赚大钱了。

        红黑客网友,我上面这一段话隐含一个真正的悖论,请认真领会。

      • 家园 技术不是绝对的

        没具体需求和业无约束底下泛泛谈开源/闭源,java/.net反而会失去技术方向的把握。而且.net真的那么不堪吗,我可是用.net做过排得上号的一个系统呢。而且还是早期的.net 2.0。

      • 家园 嗯,不得不反驳一下

        很显然纯coder的思维是不能解决这个问题的。

        其次我觉得在这个问题上讨论技术没有什么意义,或者说,太低级。

        简单解释一下低级,就是方法有很多种,偏要争哪种好这个我觉得太无聊了。这个是出钱的人说了算了的。适合的才是最好的。

        即便从技术上,.net/java/ejb/spooling/acid/开源好不好这种也太泛泛而谈。

        泛泛而谈有什么意思呢?对吧。直接略过吧。

        不过你还提到QA,release,责任等点,有那么点意思了。很多问题都是到发生了再来讨论技术可行性,晚了。好好盘算下一个项目吧。

        我老的结论是,你研究了很多技术,很好很上进。多半发给你的话,要推翻重来,也报个2000万。但是想过客户为什么不一开始就去找那些经验丰富的人来给他做方案呢?

分页树展主题 · 全看首页 上页
/ 13
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河