个人爱好分享
一. 雪球公司介绍
雪球 聪明的投资者都在这里。
web 1.0:新闻资讯,股价信息,K线图
web 2.0:SNS 订阅,分享,聊天
web 3.0:移动 APP,交易闭环
雪球现在员工数还不到100,其中技术人员占一半。去年9月C轮融资4kw刀。我们现在的技术栈由下列组件组成:Java,Scala,Akka,Finagle,Nodejs,Docker ,Hadoop。我们当前是租用IDC机房自建私有云,正在往“公私混合云”方向发展。
在雪球上,用户可以获取沪深港美2w+股票的新闻信息,股价变化情况,也可以获取债券,期货,基金,比特币,信托,理财,私募等等理财产品的各类信息,也可以关注雪球用户建立的百万组合,订阅它们的实时调仓信息,还可以关注雪球大V。雪球当前有百万日活跃用户,每天有4亿的API调用。App Store 财务免费榜第 18 名。历史上曾排到财务第二,总免费榜第 19。
二. 雪球当前总体架构
作为一个典型的移动互联网创业公司,雪球的总体架构也是非常典型的设计:
最上层是三个端:web端,android端和iOS端。流量比例大约为 2:4:4 。web3.0 的交易功能,在 web 端并不提供。
接入层以及下面的几个层,都在我们的自建机房内部。雪球当前只部署了一个机房,还属于单机房时代。正在进行“私有云+公有云混合部署”方案推进过程中。
我们当前使用 nodejs 作为 web 端模板引擎。nodejs 模块与android 和 ios 的 app 模块一起属于大前端团队负责。
再往下是位于 nginx 后面的 api 模块。跟 linkedin 的 leo 和微博的 v4 一样,雪球也有一个遗留的大一统系统,名字就叫 snowball 。最初,所有的逻辑都在 snowball 中实现的。后来慢慢的拆出去了很多 rpc 服务,再后来慢慢的拆出去了一些 http api 做成了独立业务,但即便如此,snowball 仍然是雪球系统中更大的一个部署单元。
在需要性能的地方,我们使用 netty 搭建了一些独立的接口,比如 quoto server,是用来提供开盘期间每秒一次的股价查询服务,单机 qps 5w+,这个一会再细说;而 IM 服务,起初设计里是用来提供聊天服务,而现在,它更大的用途是提供一个可靠的 push 通道,提供 5w/s 的消息下发容量,这个也一会再细说。
雪球的服务化拆分及治理采用 twitter 开源的 finagle rpc 框架,并在上面进行了一些二次开发和定制。定制的功能主要集中在 access log 增强,和 fail fast,fail over 策略及降级开关等。 finagle 的实现比较复杂,debug 和二次开发的门槛较高,团队内部对此也进行了一些讨论。
雪球的业务比较复杂,在服务层中,大致可以分为几类:之一类是web1.0,2.0 及基础服务,我们称为社区,包括用户,帖子,新闻,股价,搜索等等,类比对象就是新浪财经门户+微博;第二类是组合及推荐,主要提供股票投资策略的展示和建议,类比对象是美国的motif;第三类是通道,类似股市中的“支付宝”,接入多家券商,提供瞬间开户,一键下单等等各种方便操作的功能。
雪球的业务实现中,包含很多异步计算逻辑,比如搜索建索引,比如股票涨跌停发通知,比如组合收益计算等等,为此,我们设计了一个独立的 Thread/Task 模块,方便管理所有的后台计算任务。但随着这些 task 越来越多,逻辑差异越来越大,一个统一的模块并不是总是更佳的方案,所以,我们又把它拆成了两大类:流式的,和批量式的。
雪球的推荐体系包括组合推荐“买什么”和个性化推荐。我们最近正在重新梳理我们的大数据体系,这个感兴趣的话可以单聊。
最下面是基础设施层。雪球基础设施层包括:redis,mysql,mq,zk,hdfs,以及容器 docker。
线上服务之外,我们的开发及后台设施也很典型:gitlab开发,jenkins打包,zabbix 监控系统向 openfalcon 迁移,redimine向confluence迁移,jira,以及内部开发的 skiing 后台管理系统。
** 三. 雪球架构优化历程**
首先描述一下标题中的“股市动荡”定语修饰词吧:
上证指数从年初的3000点半年时间涨到了5000多,6月12号达到更高点5200点,然后就急转直下,更大单日跌幅 8.48%,一路跌回4000点以下。最近一周都在3900多徘徊。
3月最后一周,A股开户 166万户,超过历史更高纪录 2007年5月第二周165万户。
4月份, *** 宣布A股支持单用户开设多账户。
6月底,证金公司代表国家队入场 *** 。
7月份, *** 宣布严打场外配资。
中国好声音广告之一晚,带来超过平时峰值200倍的注册量
挑战:小 VS 大:
小:小公司的体量,团队小,机器规模小
大:堪比大公司的业务线数量,业务复杂度,瞬间峰值冲击
雪球的业务线 = 1个新浪财经 + 1 个微博 + 1 个 motif + 1 个大智慧/同花顺。由于基数小,API调用瞬间峰值大约为平时峰值的 30+ 倍。
挑战:快速增长,移动互联网 + 金融,风口,A股大盘剧烈波动。
首先,在app端,在我们核心业务从 web2.0 sns 向 3.0 移动交易闭环进化的过程中,我们开发了一个自己的 hybrid 框架:本地原生框架,加离线 h5 页面,以此来支撑我们的快速业务迭代。当前,雪球前端可以做到 2 周一个版本,且同时并行推进 3 个版本:一个在 app store 等待审核上线,一个在内测或公测,一个在开发。我们的前端架构师孟祥宇在今年的 wot 上有一个关于这方面的详细分享,有兴趣的可以稍后再深入了解。
雪球App实践—构建灵活、可靠的Hybrid框架
另外,为了保障服务的可用性,我们做了一系列的“端到端服务质量监控”。感兴趣的可以搜索我今年4月份在环信 *** meetup上做的分享《移动时代端到端的稳定性保障》。其中在 app 端,我们采用了一种代价最小的数据传输方案:对用户的 *** 流量,电池等额外消耗几乎为0
每个请求里带上前一个请求的结果
succ or fail : 1 char
失败原因:0 - 1 char
请求接口编号: 1 char
请求耗时:2 - 3 char
其它: *** 制式,etc
炒股的人大多都会盯盘:即在开盘期间,开着一个web页面或者app,实时的看股价的上下跳动。说到“实时”,美股港股当前都是流式的数据推送,但国内的A股,基本上都是每隔一段时间给出一份系统中所有股票现价的一个快照。这个时间间隔,理论上是3秒,实际上一般都在5秒左右。 交了钱签了合同,雪球作为合作方就可以从交易所下属的数据公司那里拿到数据了,然后提供给自己的用户使用。
刚才介绍总体架构图的时候有提到 quote server ,说到这是需要性能的地方。
业务场景是这样的,雪球上个人主页,开盘期间,每秒轮询一次当前用户关注的股票价格变动情况。在内部,所有的组合收益计算,每隔一段时间需要获取一下当前所有股票的实时价格。起初同时在线用户不多,这个接口就是一个部署在 snowball 中的普通接口,股价信息被实时写入 redis ,读取的时候就从 redis 中读。后来,A股大涨,snowball 抗不住了。于是我们就做了一个典型的优化:独立 server + 本地内存存储。开盘期间每次数据更新后,数据接收组件主动去更新 quote server 内存中的数据。 后续进一步优化方案是将这个接口以及相关的处理逻辑都迁移到公有云上去。
对于那些不盯盘的人,最实用的功能就是股价提醒了。在雪球上,你除了可以关注用户,还可以关注股票。如果你关注的某只股票涨了或跌了,我们都可以非常及时的通知你。雪球上热门股票拥有超过 50w 粉丝(招商银行,苏宁云商)粉丝可以设置:当这支股票涨幅或跌幅超过 x%(默认7%)时提醒我。曾经连续3天,每天超过1000股跌停, *** 开了一个会,于是接下来2天超过1000股涨停
原来做法:
股票涨(跌)x%,扫一遍粉丝列表,过滤出所有符合条件的粉丝,推送消息
新做法:
预先建立索引,开盘期间载入内存
1%:uid1,uid2
2%:uid3,uid4,uid5
3%:uid6
问题:有时候嫌太及时了:频繁跌停,打开跌停,再跌停,再打开。。。的时候
内部线上记录:
4台机器。
单条消息延时 99% 小于 30秒。
下一步优化目标:99% 小于 10 秒
IM 系统最初的设计目标是为雪球上的用户提供一个聊天的功能:
送达率之一
雪球IM:Netty + 自定义 *** 协议
Akka : 每个在线client一个actor
推模式:client 在线情况下使用推模式
多端同步:单账号多端可登录,并保持各种状态同步
移动互联网时代,除了微信qq以外的所有IM,都转型成了推送通道,核心指标变成了瞬间峰值性能。原有架构很多地方都不太合适了。
优化:
分配更多资源:推送账号actor池
精简业务逻辑:重复消息只存id,实时提醒内容不推历史设备,不更新非活跃设备的session列表等等
本地缓存:拉黑等无法精简的业务逻辑迁移到本地缓存
优化代码:异步加密存储,去除不合理的 akka 使用
akka这个解释一下:akka 有一个自己的 log adapter,内部使用一个 actor 来处理所有的 log event stream 。当瞬间峰值到来的时候,这个 event stream 一下子就堵了上百万条 log ,导致 gc 颠簸非常严重。最后的解决办法是,绕过 akka 的 log adapter,直接使用 logback 的 appender
线上记录:5w/s (主动限速)的推送持续 3 分钟,p99 性能指标无明显变化
7月10号我们在中国好声音上做了3期广告。在广告播出之前,我们针对广告可能带来的对系统的冲击进行了压力测试,主要是新用户注册模块,当时预估广告播出期间2小时新注册100万
压测发现 DB 成为瓶颈:
昵称检测 cache miss 40%
昵称禁用词 where like 模糊查询
手机号是否注册 cache miss 80%
注册新用户:5 insert
优化:
redis store:昵称,手机号
本地存储:昵称禁用词
业务流程优化:DB insert 操作同步改异步
下一步优化计划:
将 sns 系统中所有的上行操作都改成类似的异步模式
接口调用时中只更新缓存,而且主动设置5分钟过期,然后写一个消息到 mq 队列,队列处理程序拿到消息再做其它耗时操作。
为了支持失败重试,需要将主要的资源操作步骤都做成幂等。
前置模块HA:
合作方合规要求:业务单元部署到合作方内网,用户的敏感数据不允许离开进程内存
业务本身要求:业务单元本身为有状态服务,业务单元高可用
解决方案:
使用 Hazelcast In-Memory Data Grid 的 replication map 在多个 jvm 实例之间做数据同步。
java 启动参数加上 -XX:+DisableAttachMechani *** -XX:-UsePerfData,禁止 jstack,jmap 等等 jdk 工具连接
关于前置模块,其实还有很多很奇葩的故事,鉴于时间关系,这里就不展开讲了。以后有机会可以当笑话给大家讲。
组合净值计算性能优化:
一支股票可能在超过20万个组合里(南车北车中车,暴风科技)
离线计算,存储计算后的结果
股价3秒变一次,涉及到这支股票的所有组合理论上也需要每 3 秒重新计算一次
大家可能会问,为什么不用户请求时,实时计算呢?这是因为“组合净值”中还包括分红送配,分股,送股,拆股,合股,现金,红利等等,业务太过复杂,开发初期经常需要调整计算逻辑,所以就设计成后台离线计算模式了。当前正在改造,将分红送配逻辑做成离线计算,股价组成的净值实时计算。接口请求是,将实时计算部分和离线计算部分合并成最终结果。
实际上,我们的计算逻辑是比较低效的:循环遍历所有的组合,对每个组合,获取所有的价值数据,然后计算。完成一遍循环后,立即开始下一轮循环。
优化:
分级:活跃用户的活跃组合,其它组合。
批量:拉取当前所有股票的现价到 JVM 内存里,这一轮的所有组合计算都用这一份股价快照。
关于这个话题的更详细内容,感兴趣的可以参考雪球组合业务总监张岩枫在今年的 arch summit 深圳大会上的分享:构建高可用的雪球投资组合系统技术实践
最后,我们还做了一些通用的架构和性能优化,包括jdk升级到8,开发了一个基于 zookeeper 的 config center 和开关降级系统
四. 聊聊关于架构优化的一些总结和感想
在各种场合经常听说的架构优化,一般都是优化某一个具体的业务模块,将性能优化到极致。而在雪球,我们做的架构优化更多的是从问题出发,解决实际问题,解决到可以接受的程度即可。可能大家看起来会觉得很凌乱,而且每个事情单独拎出来好像都不是什么大事。
我们在对一个大服务做架构优化时,一般是往深入的本质进行挖掘;当我们面对一堆架构各异的小服务时,“架构优化”的含义其实是有一些不一样的。大部分时候,我们并不需要(也没有办法)深入到小服务的更底层进行优化,而是去掉或者优化原来明显不合理的地方就可以了。
在快速迭代的创业公司,我们可能不会针对某一个服务做很完善的架构设计和代码实现,当出现各种问题时,也不会去追求极致的优化,而是以解决瓶颈问题为先。
即使我们经历过一回将 snowball 拆分服务化的过程,但当我们重新上一个新的业务时,我们依然选择将它做成一个大一统的服务。只是这一次,我们会提前定义好每个模块的 service 接口,为以后可能的服务化铺好路。
在创业公司里,重写是不能接受的;大的重构,从时间和人力投入上看,一般也是无法承担的。而“裱糊匠”式做法,哪里有性能问题就加机器,加缓存,加数据库,有可用性问题就加重试,加log,出故障就加流程,加测试,这也不是雪球团队工作方式。我们一般都采用最小改动的方式,即,准确定义问题,定位问题根源,找到问题本质,制定更佳方案,以最小的改动代价,将问题解决到可接受的范围内。
我们现在正在所有的地方强推3个数据指标:qps,p99,error rate。每个技术人员对自己负责的服务,一定要有最基本的数据指标意识。数字,是发现问题,定位根源,找到本质的最重要的依赖条件。没有之一。
我们的原则:保持技术栈的一致性和简单性,有节制的尝试新技术,保持所有线上服务依赖的技术可控,简单来说,能 hold 住。
能用cache的地方绝不用db,能异步的地方,绝不同步。俗称的:吃一堑,长一智。
特事特办:业务在发展,需求在变化,实现方式也需要跟着变化。简单的来说:遗留系统的优化,更佳方案就是砍需求,呵呵。
[img]华信期货股份有限公司是1993-04-08在河南省注册成立的其他股份有限公司(非上市),注册地址位于郑州市郑东新区商务内环路27号楼1单元3层01号、2单元3层02号。
华信期货股份有限公司的统一社会信用代码/注册号是91410000100021394B,企业法人张岩,目前企业处于开业状态。
华信期货股份有限公司的经营范围是:商品期货经纪、金融期货经纪、期货投资咨询、资产管理、基金销售。在河南省,相近经营范围的公司总注册资本为362824万元,主要资本集中在5000万以上规模的企业中,共36家。本省范围内,当前企业的注册资本属于一般。
华信期货股份有限公司对外投资4家公司,具有20处分支机构。
通过百度企业信用查看华信期货股份有限公司更多信息和资讯。
主动提交网址给搜索引擎,譬如各大网址的收藏夹及社会化书签,导航站,下载站,行业网站,论坛等这些地方,这种 *** 比较快速,也很有效。
增加友情链接,找高权重的网站做友情链接,高权重网站的外链效果往往大于多个低权重网站的外链
在B2B网站发软文,文章内容里面增加超链接,锚文本链接,图片链接等,可以写技术性的文章,娱乐性的文章,实用知识内容,让大家知道更多知识请进某某网站,或者本内容来源某网站,
各大论坛贴吧签名带上自己的链接,到处活跃,时时带着自己的尾巴,到处曝光,个性签名有了外链,即使文章不添加都同样达到了目的哦!
收集行业各种实用小工具或者一些实用的东西植入一个链接,用户想要得到自己的东西,自然也可以点击你的外链了。这样的外链一定是非常有效果的额,因为你设置了必须来你网站才能要到这些好东西。
在一些 *** 群,微博,博客,微信群, *** 空间,人人网,朋友圈,邮箱自动回复,农场设置,个性签名等能发链接的地方都去宣传推广,发布自己的外链吧。
参与各问答平台的知识问答,为网站添加链接,其实添加链接的地方真的很多很多,可以说无处不在,譬如你购物时写评论是不是也可以带上外链呢。
26军军长与老部下喝酒,结果喝死了一个人。这个事情,相信大家都已经知道了。
从半个月前开始,这条消息就在 *** 上流传,到前天被国防部证实,公众自始至终都只是了解大概,具体的事件真相至今仍扑朔迷离。
别着急,今天就来为各位解密这背后的故事。
经过这次喝酒事件,大家对张岩可能已经比较了解了。张岩2014年10月升任26军军长,跨过年52岁,是我军目前最年轻的军长。
那天,张岩以前的部下,116师高炮团的团长从辽宁海城来到了26军。
张岩曾经长期在39军任职,其中就担任过39军116师的师长,与高炮团团长不仅非常熟悉,私人关系还很好。
当天与高炮团团长一起来找张岩的,还有大庆人武部的部长崔宝利。
张岩是辽宁辽阳人,团长与崔宝利也都是东北人,3个东北人碰到一起,又都是军人,自然要整几杯。
26军直属 *** ,军部驻地位于山东潍坊市,是乙类集团军。当天,3个人就在潍坊的军部驻地喝起了感情酒。当然,除了他们3个人,还有一帮朋友坐陪。
军人的喝酒作风大家都知道,喝到兴头上,喝酒就像打仗,整碗整碗地喝,不管酒量大小。作为老领导,张岩一个劲地让团长喝,团长不敢马虎,一不小心就整多了,当时在酒桌上就懵了,紧急送到医院后还是没能抢救过来。
喝酒喝死了人,这可是大事,不管是26军还是39军,之一个想法就是想将此事压下来,他们与死者家属接触,试图通过赔钱来私下解决。
但是死者家属并不容易打发,他们提出了2个要求,一是要求巨额赔偿金,另外就是要求给死者评“烈士”。之一个要求还好说,第二个当然难以办到,因为喝酒而死,再评为烈士,那就成了笑话。
与死者家属接触谈判的,26军是由军长张岩亲自出面,一来事情出在他手上,二来他与死者是兄弟,好说话;死者所在的单位39军则由116师师长盛海鹏出面。
但是双方没有谈妥,事情就僵持了下来。可是毕竟部队里死了一个团长,情况得向上汇报,116师于是起草了一份情况说明,隐瞒了实情,交给了蒙在鼓里的39军高层,报了上去。
白白死了一个大活人,死者家属肯定不愿意,一闹,事情就败露了,军纪委随即出面调查,之后将结果向上做了汇报。
因为此事涉及对上隐瞒,弄虚作假,据说高层很愤怒,性质上升到了“欺骗中央,对党不忠诚”,于是此案被通报全军并严肃处理:张岩被撤职,由正军降到副军免职,留党查看一年;116师师长盛海鹏降为副师免职。
什么是“由正军降到副军免职”呢?估计很多人不明白,其实这句话分两层意思,先从正职撤到副职,这是处分,待遇也随之降低,具体到张岩就是从军长降到了副军长,享受副军长待遇。
然后才是免职,这是工作变动,就是免去张岩的副军长职务,但是依然享受副军级待遇。
一句话,张岩现在是享受副军级待遇,但是已经不再是军级干部了。辛辛苦苦这么多年,因为一顿酒一下打回到原形。
事情到了这儿似乎画上了句号,但其实还远没有结束,这几个人是在什么时候喝的酒?因为什么喝酒?张岩除了是26军军长外,到底是何方神圣?
1964年11月出生的张岩是辽宁辽阳人,2014年10月升任26军军长。
张岩并非普通百姓家的孩子,他父亲名叫张海天,今年81岁,原陆军第39军政委,官至武警部队副政委,少将军衔,现已退休。
︱站立左一为张岩父亲张海天︱
张岩的岳父同样不简单,名叫汪明德,河南获嘉县人,参加过抗日战争,解放战争,和抗美援朝,是 *** 装甲兵5大司令员之一,官至 *** 司令部副参谋长,上校军衔,2003年去世。
喝酒死人事件最早在网上流传,是在2015年12月18日来自新浪的一条微博,一直到国防部证实,中间经历了不到半个月的时间。
而张岩出事前的最后一次露面,是在2015年10月30日,当时他到潍坊城市规划艺术馆进行了参观,陪同的有潍坊市委书记,市委秘书长,副市长等,10月31日,潍坊日报对此进行了报道。
自那以后,张岩再没有在公开场合露面,直到12月18日网上开始流传喝酒死人的消息。而那个时候,传言里已经明确指出张岩已经受到处理。从事件发生,再到受到处理,肯定需要一段时间。
所以据此分析,张岩他们那次喝酒的时间,很可能发生在2015年11月份的某一天。
而团长和武装部长为何突然大老远地从东北跑来山东潍坊,据说是张岩要升职,老部下和一帮朋友听说后,提前来给他祝贺,于是就攒了那顿倒霉的饭局。
有趣的是,就在2015年,官媒 *** 报还专门刊发了一篇有关26军的文章,标题是:《陆军第26集团军,改革面前聚精会神忙备战》。
我们来注意一下这篇文章的刊发时间,是在2015年12月15日,3天之后, *** 开始流传喝酒死人事件。也就是说,报道出来的时候,张岩喝酒事件已经发生,只是外界还不知晓。
不知道 *** 报去26军采访时,是否知晓这件事,但巧合的是,那篇报道里通篇都没有提到张岩字样。
值得玩味的是,那篇报道的开篇是这样一句话:改革面前忙什么?陆军第26集团军党员干部的回答是“备战”。
在经历喝酒门之后,再来看 *** 报“改革面前忙什么”这个问题,至少可以这样回答:26军的军长正在忙着喝大酒。
网站首页:期货手续费网-加1分开户(微信:527209157)
本文链接:http://52ol.cn/post/50227.html
Copyright 2012-2024 期货手续费网-加1分开户 网站地图 邮箱:diyijiaoyi@qq.com 微信:527209157 湘ICP备18014167号