免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 小尾巴鱼
打印 上一主题 下一主题

[其它] 模拟12306购票系统的处理多用户购票网络编程(已公布获奖) [复制链接]

论坛徽章:
15
2015七夕节徽章
日期:2015-08-21 11:06:172017金鸡报晓
日期:2017-01-10 15:19:56极客徽章
日期:2016-12-07 14:07:30shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之四川
日期:2016-04-13 14:36:562016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之新疆
日期:2016-01-25 14:01:34IT运维版块每周发帖之星
日期:2016-01-07 23:04:26数据库技术版块每日发帖之星
日期:2016-01-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
11 [报告]
发表于 2015-07-08 11:45 |只看该作者
这个不是几句话能说清楚的问题

论坛徽章:
7
天蝎座
日期:2014-06-04 13:29:02子鼠
日期:2014-06-16 10:07:08IT运维版块每日发帖之星
日期:2015-06-06 22:20:002015亚冠之迪拜阿赫利
日期:2015-06-08 15:24:21IT运维版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之阿尔沙巴布
日期:2015-06-18 16:37:30IT运维版块每日发帖之星
日期:2015-08-06 06:20:00
12 [报告]
发表于 2015-07-08 13:05 |只看该作者
回复 11# heguangwu

每个人都可以着重有自己的见解


   

论坛徽章:
6
CU大牛徽章
日期:2013-05-20 10:43:41IT运维版块每日发帖之星
日期:2016-07-29 06:20:00IT运维版块每日发帖之星
日期:2016-01-27 06:20:00CU大牛徽章
日期:2013-05-20 10:44:16CU大牛徽章
日期:2013-05-20 10:44:0615-16赛季CBA联赛之广东
日期:2018-03-09 11:17:08
13 [报告]
发表于 2015-07-09 22:42 |只看该作者
1很多用户登录服务器是协议用TCP还是UDP?
WEB应用的话,不用说都是TCP,因为HTTP就是在TCP之上的。C/S架构的应用的话,大多数都用TCP,用UDP的我目前确实还没见过。

2如果用UDP如何解决数据的不安全性,
要用UDP保证数据安全性和一致性,貌似也就是自己实现重传,确认等步骤。据说qq的消息就是用的UDP协议。
我上家公司有部分通信协议也是用udp实现的,至于有没有问题,我可以负责的说,系统运行了几年一直很稳定。
BTW, 我记得有篇文章讲abstraction leaks, 这里wiki上有这么个页面,en.wikipedia.org/wiki/Leaky_abstraction,大家可以看看。

3如果用TCP如何解决占用大连网络资源造成网络阻塞的问题。
(多个用户相当于多个线程,并通过socket与服务器建立连接。)
有段时间,nodejs很火,被用来构建各种restful api,其中有个重要特性就是事件驱动,非阻塞IO。nginx性能高效,也与其采用了kqueue,epoll有关。
其实在同一时刻,注意是时刻,数据量超出带宽所承受的范围,那么除了加带宽,没有其它办法。这是个非常极端的例子。
如果是时间段,那么可以用并发来解决,要做到尽量不让网络IO阻塞,举个简单例子,某请求涉及到数据库查询,假设数据库查询时间为10ms,用户与服务器建立链接的时间为10ms,有两个用户同时请求同一个操作,并假设服务器(这里就隐含指WEB服务器)同一时刻只能处理一个请求(这里是为了尽量简化问题)。A,B同时发出请求,A的请求先被服务器处理,那么B只能等待,如果必须等A全部处理完之后B才能被服务器接受,那么B得等20ms,若A建立完链接后,链接被挂起,等数据库处理完返回数据后A再被处理,这样B就在A的数据库处理阶段,完成与服务器建立连接操作,那么B等待的时间也就10ms。
总的来说,其实也就是最大程度利用网络IO,CPU,内存等。永远不要让某个部分空转。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
14 [报告]
发表于 2015-07-11 09:23 |只看该作者
本帖最后由 yulihua49 于 2015-07-11 12:15 编辑
小尾巴鱼 发表于 2015-07-03 16:28
话题背景:

对,我们本期的结论是:技术大神是练出来!凡所有我们所崇拜的大神都有共同的特点就是”都解 ...

12306是个很复杂的系统,大致分为两个层面,一个是售票核心系统,一个是网络客户服务系统,中间是安全隔离系统。
核心系统包括票额的分配和生成,资源的调配,售订退改检,后期的统计分析,结账、清分结算等。
12306只涉及 订改退这一块。
安全隔离,也是影响吞吐量的重要因素。
你所能接触到的是客服(订单处理、支付)这一块。
这块使用的技术与核心系统根本就不是一回事。

前边有个说异构数据库,那不是必须的。
由于历史原因,核心数据库使用SYBASE,性能确实差强人意,但也没办法了。
外围客服(网购)这一块使用ORACLE,用于处理订单。
两个部分都是一个巨大的架构,我们来学习哪一部分呢?

不管哪一部分,UDP是无需考虑的了。
外围的基本是HTTP。内层的,很遗憾,现有系统是二层C/S, powerbuild 连接SYBASE,一切依赖存储过程。中间虽然有个CTMS隔离,也不能算是一层。
历史原因,它并不是一个理想的架构。我们倒是能提出一些新思路。(严格加锁下,还要高并发,办法你想)。

你们可能关注的是吞吐量和流畅性,但是,更重要的是确保交易完整性,就是,席票账的一致性。简单说,就是在激烈竞争的环境下,不能重票,丢票,错帐(严格加锁下,还要高并发,办法你想)。。
这是铁路客票系统最独特的,一席一票,其他任何系统都不要求商品对号入座。

对架构更大的争议是:核心数据库是分布的还是集中的。集中,集中些什么。分布,又怎样分布。这个争议贯穿在这个系统整个生命期。

抗攻击性也是这个系统的重要议题,这个你懂的。

这个题目太大,不适合用作作业。可以用来做见习架构师的研究课题。

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
15 [报告]
发表于 2015-07-11 18:47 |只看该作者
1.无疑tcp.这种数据量本身并不大。可靠性要求较高。
  有了epoll这些技术,tcp的链接限制并用太多考虑。
2。udp
  一切都要应用层搞定,适合比较小,比较简单的系统。
3.主要存在2个瓶颈,前端的http入口链接限制,后端的数据库访问链接限制
如果是当下最新的架构
用nodejs或者go,前端轻松拿下c10k级别的并发,后端的链接数变得可以忽略不计
中间可以考虑kafka队列存储请求,异步并行处理。
后端可以分布式数据库。
或者更极端一点,直接voltdb, 基于内存的OLTP方案。

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
16 [报告]
发表于 2015-07-12 22:10 |只看该作者
本帖最后由 shenlanyouyu 于 2015-08-06 01:16 编辑

1 很多用户登录服务器是协议用TCP还是UDP?、
用户登录服务器大多用的TCP协议,基于Web的用户登录服务器,采用的TCP。TCP维持多人同时在线,占用较多的资源。QQ登陆时采用的TCP协议,在聊天数据传输采用的UDP。
对于12306网站,是典型的B/S架构,用户登录时基于HTTP/HTTPS,登录服务器协议是TCP。

2 如果用UDP如何解决数据的不安全性。
首先我们要明白为什么UDP协议不安全,而TCP协议是安全的。
(1)TCP传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
(2)UDP用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,没有控制位和序列号,故而传输速度很快。由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,系统开销较小。

使用UDP解决数据的不安全性,需要从UDP存在的问题出发,基本上是采取了TCP协议的重发机制、拥塞控制,在应用层来保证数据的安全性。可以参考的协议有RTP/RUDP/UDT。基本的方法如下:
在发送端:
(1)  UDP传输的数据包没有TCP大,因此在应用层需要实现分包机制。
(2) 在应用层数据包中添加确认标识,重传计数,为每一个UDP分组设置定时器,处理定时器超时事件,对于不需求确认的包,默认发成功,对于需要确认的包,在没有达到最大重传计数的包,重传包并设置重传计数器,否则报告发送失败事件。
在接收端:
(1) 对于有确认字段的UDP包,发送确认包。
(2) 对于分段包,排序后提交应用层,非分段包直接提交。
为了保证传输过程中数据的安全性,不被非法分子窥见,采用数据加密的方法来解决,发送端和接收端加密算法和解密算法需要一致。

以UDT为例子,UDT拥塞控制算法将速率控制和流量控制合并起来,前者调整包的发送周期,后者限制最大的位被应答的包。UDT有两种包:数据包和控制包。通过包头的第一位来区分标志位。如是0,表示是数据包,1表示是控制包。
(1)数据包结构如下显示:

包序号是UDT数据包头中唯一的内容,序列号是个无符号整数,使用标志位后的31位,UDT使用包基础的需要,
(2)控制包控制包结构如下

UDT使用应答子序号的方法。每个ACK/ACK2包有一个无符号的16位序号。

关于第3个问题单独回复。

论坛徽章:
9
2015年亚洲杯之中国
日期:2015-03-30 15:47:152015亚冠之布里斯班狮吼
日期:2015-09-24 09:24:52技术图书徽章
日期:2015-12-04 19:47:59数据库技术版块每日发帖之星
日期:2015-12-13 06:20:00CU十四周年纪念徽章
日期:2016-06-15 11:23:562017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之四川
日期:2020-01-02 09:33:04CU十四周年纪念徽章
日期:2020-01-14 21:07:5615-16赛季CBA联赛之江苏
日期:2020-04-28 13:59:15
17 [报告]
发表于 2015-07-13 15:57 |只看该作者
我是新手,纯是进来学习,看看各位怎么分析的

论坛徽章:
4
IT运维版块每日发帖之星
日期:2015-08-19 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-28 06:20:00IT运维版块每周发帖之星
日期:2015-09-11 19:20:31
18 [报告]
发表于 2015-07-13 16:06 |只看该作者
案例:模拟12306购票系统处理多用户购票信息的网络编程实现。

讨论问题:

TCP协议:传输控制协议
UDP协议:用户数据报协议

TCP是面向连接的协议,对数据的完整性、正确性要求很高,协议中含有大量的控制信息,如对时序、完整性、正确性的控制和验证,但协议的信息冗余很高,传输效率很低。UDP是无连接的协议,不建立连接,不需要维护连接状态,包括收发状态等,可以一对多发送,数据安全度低,但网络传输效率很高。

使用UDP协议的应用协议包括:DNS、TFTP、RIP、BOOTP、DHCP、SNMP、NFS、NTP、IP电话、流式多媒体通信 、IGMP等。当然还包括QQ。

1很多用户登录服务器是协议用TCP还是UDP?

一般用TCP,但理论上用UDP也可以。对于使用UDP传输的应用,在身份认证阶段可以使用TCP方式,采用混合协议模式。


2如果用UDP如何解决数据的不安全性,

在应用层控制,就像QQ一样。

3如果用TCP如何解决占用大连网络资源造成网络阻塞的问题。
(多个用户相当于多个线程,并通过socket与服务器建立连接。)

应用交付控制(ADC)系统中可采用连接复用的方式,或者像中间件、Oracle那样做成共享连接池的模式,都可以减少TCP连接数量,降低服务器和网络负载。

论坛徽章:
15
2015七夕节徽章
日期:2015-08-21 11:06:172017金鸡报晓
日期:2017-01-10 15:19:56极客徽章
日期:2016-12-07 14:07:30shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之四川
日期:2016-04-13 14:36:562016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之新疆
日期:2016-01-25 14:01:34IT运维版块每周发帖之星
日期:2016-01-07 23:04:26数据库技术版块每日发帖之星
日期:2016-01-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
19 [报告]
发表于 2015-07-15 11:42 |只看该作者
回复 12# 小尾巴鱼

首先购票系统是WEB方式,这就意味着主要是HTTP方式访问,一般来说TCP是首选了
再说网络问题好解决,首选CDN就可以根据分流,根据用户IP重定向到不同的HTTP服务器上,网络几个亿的连接也是很容易实现的,所以个人认为12306的瓶颈不是在网络而是在数据库,因为网络连接可以分担到几百上千台机器(通过租用云等方式)网络根本不会有大的问题,主要的问题是页面展示火车票的信息及订票操作,这个归根到底还是要和数据库打交道,瓶颈在这里


   

论坛徽章:
4
IT运维版块每日发帖之星
日期:2015-08-04 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:002015亚冠之阿尔艾因
日期:2015-11-08 10:27:01CU十四周年纪念徽章
日期:2020-11-05 14:10:23
20 [报告]
发表于 2015-07-15 15:40 |只看该作者
1很多用户登录服务器是协议用TCP还是UDP?
  当然是TCP了,UDP是广播性质的
2如果用UDP如何解决数据的不安全性,
  UDP这种广播性质协议,不太适合数据的双向交互
3如果用TCP如何解决占用大连网络资源造成网络阻塞的问题。
(多个用户相当于多个线程,并通过socket与服务器建立连接。)
用epoll的方式可以增加socket支持的连接数,采用事件驱动的方式来减少阻塞得时间,用负载均衡的方式来分减流量的压力
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP