profiling大数据|如何实现支持数亿用户的长连消息系统

❶ 求问什么是数据挖掘

数据挖掘相关的10个问题 NO.1 Data Mining 和统计分析有什么不同? 硬要去区分Data Mining和Statistics的差异其实是没有太大意义的。一般将之定义为Data Mining技术的CART、CHAID或模糊计算等等理论方法,也都是由统计学者根据统计理论所发展衍生,换另一个角度看,Data Mining有相当大的比重是由高等统计学中的多变量分析所支撑。但是为什么Data Mining的出现会引发各领域的广泛注意呢?主要原因在相较于传统统计分析而言,Data Mining有下列几项特性: 1.处理大量实际数据更强势,且无须太专业的统计背景去使用Data Mining的工具; 2.数据分析趋势为从大型数据库抓取所需数据并使用专属计算机分析软件,Data Mining的工具更符合企业需求; 3. 纯就理论的基础点来看,Data Mining和统计分析有应用上的差别,毕竟Data Mining目的是方便企业终端用户使用而非给统计学家检测用的。 NO.2 Data Warehousing 和 Data Mining 的关系为何? 若将Data Warehousing(数据仓库)比喻作矿坑,Data Mining就是深入矿坑采矿的工作。毕竟Data Mining不是一种无中生有的魔术,也不是点石成金的炼金术,若没有够丰富完整的数据,是很难期待Data Mining能挖掘出什么有意义的信息的。 要将庞大的数据转换成为有用的信息,必须先有效率地收集信息。随着科技的进步,功能完善的数据库系统就成了最好的收集数据的工具。数据仓库,简单地说,就是搜集来自其它系统的有用数据,存放在一整合的储存区内。所以其实就是一个经过处理整合,且容量特别大的关系型数据库,用以储存决策支持系统(Design Support System)所需的数据,供决策支持或数据分析使用。从信息技术的角度来看,数据仓库的目标是在组织中,在正确的时间,将正确的数据交给正确的人。 许多人对于Data Warehousing和Data Mining时常混淆,不知如何分辨。其实,数据仓库是数据库技术的一个新主题,利用计算机系统帮助我们操作、计算和思考,让作业方式改变,决策方式也跟着改变。 数据仓库本身是一个非常大的数据库,它储存着由组织作业数据库中整合而来的数据,特别是指事务处理系统OLTP(On-Line Transactional Processing)所得来的数据。将这些整合过的数据置放于数据昂哭中,而公司的决策者则利用这些数据作决策;但是,这个转换及整合数据的过程,是建立一个数据仓库最大的挑战。因为将作业中的数据转换成有用的的策略性信息是整个数据仓库的重点。综上所述,数据仓库应该具有这些数据:整合性数据(integrated data)、详细和汇总性的数据(detailed and summarized data)、历史数据、解释数据的数据。从数据仓库挖掘出对决策有用的信息与知识,是建立数据仓库与使用Data Mining的最大目的,两者的本质与过程是两回事。换句话说,数据仓库应先行建立完成,Data mining才能有效率的进行,因为数据仓库本身所含数据是干净(不会有错误的数据参杂其中)、完备,且经过整合的。因此两者关系或许可解读为Data Mining是从巨大数据仓库中找出有用信息的一种过程与技术。 NO.3 OLAP 能不能代替 Data Mining? 所谓OLAP(Online Analytical Process)意指由数据库所连结出来的在线分析处理程序。有些人会说:「我已经有OLAP的工具了,所以我不需要Data Mining。」事实上两者间是截然不同的,主要差异在于Data Mining用在产生假设,OLAP则用于查证假设。简单来说,OLAP是由使用者所主导,使用者先有一些假设,然后利用OLAP来查证假设是否成立;而Data Mining则是用来帮助使用者产生假设。所以在使用OLAP或其它Query的工具时,使用者是自己在做探索(Exploration),但Data Mining是用工具在帮助做探索。 举个例子来看,一市场分析师在为超市规划货品架柜摆设时,可能会先假设婴儿尿布和婴儿奶粉会是常被一起购买的产品,接着便可利用OLAP的工具去验证此假设是否为真,又成立的证据有多明显;但Data Mining则不然,执行Data Mining的人将庞大的结帐数据整理后,并不需要假设或期待可能的结果,透过Mining技术可找出存在于数据中的潜在规则,于是我们可能得到例如尿布和啤酒常被同时购买的意料外之发现,这是OLAP所做不到的。 Data Mining常能挖掘出超越归纳范围的关系,但OLAP仅能利用人工查询及可视化的报表来确认某些关系,是以Data Mining此种自动找出甚至不会被怀疑过的数据模型与关系的特性,事实上已超越了我们经验、教育、想象力的限制,OLAP可以和Data Mining互补,但这项特性是Data Mining无法被OLAP取代的。 NO.4 完整的Data Mining 包含哪些步骤? 以下提供一个Data Mining的进行步骤以为参考: 1. 理解业务与理解数据; 2. 获取相关技术与知识; 3. 整合与查询数据; 4. 去除错误或不一致及不完整的数据; 5. 由数据选取样本先行试验; 6. 建立数据模型 7. 实际Data Mining的分析工作; 8. 测试与检验; 9. 找出假设并提出解释; 10. 持续应用于企业流程中。 由上述步骤可看出,Data Mining牵涉了大量的准备工作与规划过程,事实上许多专家皆认为整套Data Mining的进行有80﹪的时间精力是花费在数据前置作业阶段,其中包含数据的净化与格式转换甚或表格的连结。由此可知Data Mining只是信息挖掘过程中的一个步骤而已,在进行此步骤前还有许多的工作要先完成。 NO.5 Data Mining 运用了哪些理论与技术? Data Mining是近年来数据库应用技术中相当热门的议题,看似神奇、听来时髦,实际上却也不是什么新东西,因其所用之诸如预测模型、数据分割,连结分析(Link Analysis)、偏差侦测(Deviation Detection)等,美国早在二次世界大战前就已应用运用在人口普查及军事等方面。 随着信息科技超乎想象的进展,许多新的计算机分析工具问世,例如关系型数据库、模糊计算理论、基因算法则以及类神经网络等,使得从数据中发掘宝藏成为一种系统性且可实行的程序。 一般而言,Data Mining的理论技术可分为传统技术与改良技术两支。 传统技术以统计分析为代表,统计学内所含序列统计、概率论、回归分析、类别数据分析等都属于传统数据挖掘技术,尤其 Data Mining 对象多为变量繁多且样本数庞大的数据,是以高等统计学里所含括之多变量分析中用来精简变量的因素分析(Factor Analysis)、用来分类的判别分析(Discriminant Analysis),以及用来区隔群体的分群分析(Cluster Analysis)等,在Data Mining过程中特别常用。 在改良技术方面,应用较普遍的有决策树理论(Decision Trees)、类神经网络(Neural Network)以及规则归纳法(Rules Inction)等。决策树是一种用树枝状展现数据受各变量的影响情形之预测模型,根据对目标变量产生之效应的不同而建构分类的规则,一般多运用在对客户数据的分析上,例如针对有回函与未回含的邮寄对象找出影响其分类结果的变量组合,常用分类方法为CART(Classification and Regression Trees)及CHAID(Chi-Square Automatic Interaction Detector)两种。 类神经网络是一种仿真人脑思考结构的数据分析模式,由输入之变量与数值中自我学习并根据学习经验所得之知识不断调整参数以期建构数据的型样(patterns)。类神经网络为非线性的设计,与传统回归分析相比,好处是在进行分析时无须限定模式,特别当数据变量间存有交互效应时可自动侦测出;缺点则在于其分析过程为一黑盒子,故常无法以可读之模型格式展现,每阶段的加权与转换亦不明确,是故类神经网络多利用于数据属于高度非线性且带有相当程度的变量交感效应时。 规则归纳法是知识发掘的领域中最常用的格式,这是一种由一连串的「如果…/则…(If / Then)」之逻辑规则对数据进行细分的技术,在实际运用时如何界定规则为有效是最大的问题,通常需先将数据中发生数太少的项目先剔除,以避免产生无意义的逻辑规则。 NO.6 Data Mining包含哪些主要功能? Data Mining实际应用功能可分为三大类六分项来说明:Classification和Clustering属于分类区隔类;Regression和Time-series属于推算预测类;Association和Sequence则属于序列规则类。 Classification是根据一些变量的数值做计算,再依照结果作分类。(计算的结果最后会被分类为几个少数的离散数值,例如将一组数据分为 "可能会响应" 或是 "可能不会响应" 两类)。Classification常被用来处理如前所述之邮寄对象筛选的问题。我们会用一些根据历史经验已经分类好的数据来研究它们的特征,然后再根据这些特征对其他未经分类或是新的数据做预测。这些我们用来寻找特征的已分类数据可能是来自我们的现有的客户数据,或是将一个完整数据库做部份取样,再经由实际的运作来测试;譬如利用一个大型邮寄对象数据库的部份取样来建立一个Classification Model,再利用这个Model来对数据库的其它数据或是新的数据作分类预测。 Clustering用在将数据分群,其目的在于将群间的差异找出来,同时也将群内成员的相似性找出来。Clustering与Classification不同的是,在分析前并不知道会以何种方式或根据来分类。所以必须要配合专业领域知识来解读这些分群的意义。 Regression是使用一系列的现有数值来预测一个连续数值的可能值。若将范围扩大亦可利用Logistic Regression来预测类别变量,特别在广泛运用现代分析技术如类神经网络或决策树理论等分析工具,推估预测的模式已不在止于传统线性的局限,在预测的功能上大大增加了选择工具的弹性与应用范围的广度。 Time-Series Forecasting与Regression功能类似,只是它是用现有的数值来预测未来的数值。两者最大差异在于Time-Series所分析的数值都与时间有关。Time-Series Forecasting的工具可以处理有关时间的一些特性,譬如时间的周期性、阶层性、季节性以及其它的一些特别因素(如过去与未来的关连性)。 Association是要找出在某一事件或是数据中会同时出现的东西。举例而言,如果A是某一事件的一种选择,则B也出现在该事件中的机率有多少。(例如:如果顾客买了火腿和柳橙汁,那么这个顾客同时也会买牛奶的机率是85%。) Sequence Discovery与Association关系很密切,所不同的是Sequence Discovery中事件的相关是以时间因素来作区隔(例如:如果A股票在某一天上涨12%,而且当天股市加权指数下降,则B股票在两天之内上涨的机率是 68%)。 NO.7 Data Mining在各领域的应用情形为何? Data Mining在各领域的应用非常广泛,只要该产业拥有具分析价值与需求的数据仓储或数据库,皆可利用Mining工具进行有目的的挖掘分析。一般较常见的应用案例多发生在零售业、直效行销界、制造业、财务金融保险、通讯业以及医疗服务等。 于销售数据中发掘顾客的消费习性,并可藉由交易纪录找出顾客偏好的产品组合,其它包括找出流失顾客的特征与推出新产品的时机点等等都是零售业常见的实例;直效行销强调的分众概念与数据库行销方式在导入Data Mining的技术后,使直效行销的发展性更为强大,例如利用Data Mining分析顾客群之消费行为与交易纪录,结合基本数据,并依其对品牌价值等级的高低来区隔顾客,进而达到差异化行销的目的;制造业对Data Mining的需求多运用在品质控管方面,由制造过程中找出影响产品品质最重要的因素,以期提高作业流程的效率。 近来电话公司、信用卡公司、保险公司以及股票交易商对于诈欺行为的侦测(Fraud Detection)都很有兴趣,这些行业每年因为诈欺行为而造成的损失都非常可观,Data Mining可以从一些信用不良的客户数据中找出相似特征并预测可能的诈欺交易,达到减少损失的目的。财务金融业可以利用 Data Mining来分析市场动向,并预测个别公司的营运以及股价走向。Data Mining的另一个独特的用法是在医疗业,用来预测手术、用药、诊断、或是流程控制的效率。 NO.8 Web Mining 和Data Mining有什么不同? 如果将Web视为CRM的一个新的Channel,则Web Mining便可单纯看做Data Mining应用在网络数据的泛称。 该如何测量一个网站是否成功?哪些内容、优惠、广告是人气最旺的?主要访客是哪些人?什么原因吸引他们前来?如何从堆积如山之大量由网络所得数据中找出让网站运作更有效率的操作因素?以上种种皆属Web Mining 分析之范畴。Web Mining 不仅只限于一般较为人所知的log file分析,除了计算网页浏览率以及访客人次外,举凡网络上的零售、财务服务、通讯服务、政府机关、医疗咨询、远距教学等等,只要由网络连结出的数据库够大够完整,所有Off-Line可进行的分析,Web Mining都可以做,甚或更可整合Off-Line及On-Line的数据库,实施更大规模的模型预测与推估,毕竟凭借网际网络的便利性与渗透力再配合网络行为的可追踪性与高互动特质,一对一行销的理念是最有机会在网络世界里完全落实的。 整体而言,Web Mining具有以下特性:1. 数据收集容易且不引人注意,所谓凡走过必留下痕迹,当访客进入网站后的一切浏览行为与历程都是可以立即被纪录的;2. 以交互式个人化服务为终极目标,除了因应不同访客呈现专属设计的网页之外,不同的访客也会有不同的服务;3. 可整合外部来源数据让分析功能发挥地更深更广,除了log file、cookies、会员填表数据、线上调查数据、线上交易数据等由网络直接取得的资源外,结合实体世界累积时间更久、范围更广的资源,将使分析的结果更准确也更深入。 利用Data Mining技术建立更深入的访客数据剖析,并赖以架构精准的预测模式,以期呈现真正智能型个人化的网络服务,是Web Mining努力的方向。 NO.9 Data Mining 在 CRM 中扮演的角色为何? CRM(Customer Relationship Management)是近来引起热烈讨论与高度关切的议题,尤其在直效行销的崛起与网络的快速发展带动下,跟不上CRM的脚步如同跟不上时代。事实上CRM并不算新发明,奥美直效行销推动十数年的CO(Customer Ownership)就是现在大家谈的CRM—客户关系管理。 Data Mining应用在CRM的主要方式可对应在Gap Analysis之三个部分: 针对Acquisition Gap,可利用Customer Profiling找出客户的一些共同的特征,希望能藉此深入了解客户,藉由Cluster Analysis对客户进行分群后再透过Pattern Analysis预测哪些人可能成为我们的客户,以帮助行销人员找到正确的行销对象,进而降低成本,也提高行销的成功率。 针对Sales Gap,可利用Basket Analysis帮助了解客户的产品消费模式,找出哪些产品客户最容易一起购买,或是利用Sequence Discovery预测客户在买了某一样产品之后,在多久之内会买另一样产品等等。利用 Data Mining可以更有效的决定产品组合、产品推荐、进货量或库存量,甚或是在店里要如何摆设货品等,同时也可以用来评估促销活动的成效。 针对Retention Gap,可以由原客户后来却转成竞争对手的客户群中,分析其特征,再根据分析结果到现有客户数据中找出可能转向的客户,然后设计一些方法预防客户流失;更有系统的做法是藉由Neural Network根据客户的消费行为与交易纪录对客户忠诚度进行Scoring的排序,如此则可区隔流失率的等级进而配合不同的策略。 CRM不是设一个(080)客服专线就算了,更不仅只是把一堆客户基本数据输入计算机就够,完整的CRM运作机制在相关的硬软件系统能健全的支持之前,有太多的数据准备工作与分析需要推动。

❷ 如何实现支持数亿用户的长连消息系统

此文是根据周洋在【高可用架构群】中的分享内容整理而成,转发请注明出处。周洋,360手机助手技术经理及架构师,负责360长连接消息系统,360手机助手架构的开发与维护。不知道咱们群名什么时候改为“Python高可用架构群”了,所以不得不说,很荣幸能在接下来的一个小时里在Python群里讨论golang….360消息系统介绍360消息系统更确切的说是长连接push系统,目前服务于360内部多个产品,开发平台数千款app,也支持部分聊天业务场景,单通道多app复用,支持上行数据,提供接入方不同粒度的上行数据和用户状态回调服务。目前整个系统按不同业务分成9个功能完整的集群,部署在多个idc上(每个集群覆盖不同的idc),实时在线数亿量级。通常情况下,pc,手机,甚至是智能硬件上的360产品的push消息,基本上是从我们系统发出的。关于push系统对比与性能指标的讨论很多同行比较关心go语言在实现push系统上的性能问题,单机性能究竟如何,能否和其他语言实现的类似系统做对比么?甚至问如果是创业,第三方云推送平台,推荐哪个?其实各大厂都有类似的push系统,市场上也有类似功能的云服务。包括我们公司早期也有erlang,nodejs实现的类似系统,也一度被公司要求做类似的对比测试。我感觉在讨论对比数据的时候,很难保证大家环境和需求的统一,我只能说下我这里的体会,数据是有的,但这个数据前面估计会有很多定语~第一个重要指标:单机的连接数指标做过长连接的同行,应该有体会,如果在稳定连接情况下,连接数这个指标,在没有网络吞吐情况下对比,其实意义往往不大,维持连接消耗cpu资源很小,每条连接tcp协议栈会占约4k的内存开销,系统参数调整后,我们单机测试数据,最高也是可以达到单实例300w长连接。但做更高的测试,我个人感觉意义不大。因为实际网络环境下,单实例300w长连接,从理论上算压力就很大:实际弱网络环境下,移动客户端的断线率很高,假设每秒有1000分之一的用户断线重连。300w长连接,每秒新建连接达到3w,这同时连入的3w用户,要进行注册,加载离线存储等对内rpc调用,另外300w长连接的用户心跳需要维持,假设心跳300s一次,心跳包每秒需要1w tps。单播和多播数据的转发,广播数据的转发,本身也要响应内部的rpc调用,300w长连接情况下,gc带来的压力,内部接口的响应延迟能否稳定保障。这些集中在一个实例中,可用性是一个挑战。所以线上单实例不会hold很高的长连接,实际情况也要根据接入客户端网络状况来决定。第二个重要指标:消息系统的内存使用量指标这一点上,使用go语言情况下,由于协程的原因,会有一部分额外开销。但是要做两个推送系统的对比,也有些需要确定问题。比如系统从设计上是否需要全双工(即读写是否需要同时进行)如果半双工,理论上对一个用户的连接只需要使用一个协程即可(这种情况下,对用户的断线检测可能会有延时),如果是全双工,那读/写各一个协程。两种场景内存开销是有区别的。另外测试数据的大小往往决定我们对连接上设置的读写buffer是多大,是全局复用的,还是每个连接上独享的,还是动态申请的。另外是否全双工也决定buffer怎么开。不同的策略,可能在不同情况的测试中表现不一样。第三个重要指标:每秒消息下发量这一点上,也要看我们对消息到达的QoS级别(回复ack策略区别),另外看架构策略,每种策略有其更适用的场景,是纯粹推?还是推拉结合?甚至是否开启了消息日志?日志库的实现机制、以及缓冲开多大?flush策略……这些都影响整个系统的吞吐量。另外为了HA,增加了内部通信成本,为了避免一些小概率事件,提供闪断补偿策略,这些都要考虑进去。如果所有的都去掉,那就是比较基础库的性能了。所以我只能给出大概数据,24核,64G的服务器上,在QoS为message at least,纯粹推,消息体256B~1kB情况下,单个实例100w实际用户(200w+)协程,峰值可以达到2~5w的QPS…内存可以稳定在25G左右,gc时间在200~800ms左右(还有优化空间)。我们正常线上单实例用户控制在80w以内,单机最多两个实例。事实上,整个系统在推送的需求上,对高峰的输出不是提速,往往是进行限速,以防push系统瞬时的高吞吐量,转化成对接入方业务服务器的ddos攻击所以对于性能上,我感觉大家可以放心使用,至少在我们这个量级上,经受过考验,go1.5到来后,确实有之前投资又增值了的感觉。消息系统架构介绍下面是对消息系统的大概介绍,之前一些同学可能在gopher china上可以看到分享,这里简单讲解下架构和各个组件功能,额外补充一些当时遗漏的信息:架构图如下,所有的service都 written by golang.几个大概重要组件介绍如下:dispatcher service根据客户端请求信息,将应网络和区域的长连接服务器的,一组IP传送给客户端。客户端根据返回的IP,建立长连接,连接Room service.room Service,长连接网关,hold用户连接,并将用户注册进register service,本身也做一些接入安全策略、白名单、IP限制等。register service是我们全局session存储组件,存储和索引用户的相关信息,以供获取和查询。coordinator service用来转发用户的上行数据,包括接入方订阅的用户状态信息的回调,另外做需要协调各个组件的异步操作,比如kick用户操作,需要从register拿出其他用户做异步操作.saver service是存储访问层,承担了对redis和mysql的操作,另外也提供部分业务逻辑相关的内存缓存,比如广播信息的加载可以在saver中进行缓存。另外一些策略,比如客户端sdk由于被恶意或者意外修改,每次加载了消息,不回复ack,那服务端就不会删除消息,消息就会被反复加载,形成死循环,可以通过在saver中做策略和判断。(客户端总是不可信的)。center service提供给接入方的内部api服务器,比如单播或者广播接口,状态查询接口等一系列api,包括运维和管理的api。举两个常见例子,了解工作机制:比如发一条单播给一个用户,center先请求Register获取这个用户之前注册的连接通道标识、room实例地址,通过room service下发给长连接 Center Service比较重的工作如全网广播,需要把所有的任务分解成一系列的子任务,分发给所有center,然后在所有的子任务里,分别获取在线和离线的所有用户,再批量推到Room Service。通常整个集群在那一瞬间压力很大。deployd/agent service用于部署管理各个进程,收集各组件的状态和信息,zookeeper和keeper用于整个系统的配置文件管理和简单调度关于推送的服务端架构常见的推送模型有长轮训拉取,服务端直接推送(360消息系统目前主要是这种),推拉结合(推送只发通知,推送后根据通知去拉取消息).拉取的方式不说了,现在并不常用了,早期很多是nginx+lua+redis,长轮训,主要问题是开销比较大,时效性也不好,能做的优化策略不多。直接推送的系统,目前就是360消息系统这种,消息类型是消耗型的,并且对于同一个用户并不允许重复消耗,如果需要多终端重复消耗,需要抽象成不同用户。推的好处是实时性好,开销小,直接将消息下发给客户端,不需要客户端走从接入层到存储层主动拉取.但纯推送模型,有个很大问题,由于系统是异步的,他的时序性无法精确保证。这对于push需求来说是够用的,但如果复用推送系统做im类型通信,可能并不合适。对于严格要求时序性,消息可以重复消耗的系统,目前也都是走推拉结合的模型,就是只使用我们的推送系统发通知,并附带id等给客户端做拉取的判断策略,客户端根据推送的key,主动从业务服务器拉取消息。并且当主从同步延迟的时候,跟进推送的key做延迟拉取策略。同时也可以通过消息本身的QoS,做纯粹的推送策略,比如一些“正在打字的”低优先级消息,不需要主动拉取了,通过推送直接消耗掉。哪些因素决定推送系统的效果?首先是sdk的完善程度,sdk策略和细节完善度,往往决定了弱网络环境下最终推送质量.SDK选路策略,最基本的一些策略如下:有些开源服务可能会针对用户hash一个该接入区域的固定ip,实际上在国内环境下不可行,最好分配器(dispatcher)是返回散列的一组,而且端口也要参开,必要时候,客户端告知是retry多组都连不上,返回不同idc的服务器。因为我们会经常检测到一些case,同一地区的不同用户,可能对同一idc内的不同ip连通性都不一样,也出现过同一ip不同端口连通性不同,所以用户的选路策略一定要灵活,策略要足够完善.另外在选路过程中,客户端要对不同网络情况下的长连接ip做缓存,当网络环境切换时候(wifi、2G、3G),重新请求分配器,缓存不同网络环境的长连接ip。客户端对于数据心跳和读写超时设置,完善断线检测重连机制针对不同网络环境,或者客户端本身消息的活跃程度,心跳要自适应的进行调整并与服务端协商,来保证链路的连通性。并且在弱网络环境下,除了网络切换(wifi切3G)或者读写出错情况,什么时候重新建立链路也是一个问题。客户端发出的ping包,不同网络下,多久没有得到响应,认为网络出现问题,重新建立链路需要有个权衡。另外对于不同网络环境下,读取不同的消息长度,也要有不同的容忍时间,不能一刀切。好的心跳和读写超时设置,可以让客户端最快的检测到网络问题,重新建立链路,同时在网络抖动情况下也能完成大数据传输。结合服务端做策略另外系统可能结合服务端做一些特殊的策略,比如我们在选路时候,我们会将同一个用户尽量映射到同一个room service实例上。断线时,客户端尽量对上次连接成功的地址进行重试。主要是方便服务端做闪断情况下策略,会暂存用户闪断时实例上的信息,重新连入的 时候,做单实例内的迁移,减少延时与加载开销.客户端保活策略很多创业公司愿意重新搭建一套push系统,确实不难实现,其实在协议完备情况下(最简单就是客户端不回ack不清数据),服务端会保证消息是不丢的。但问题是为什么在消息有效期内,到达率上不去?往往因为自己app的push service存活能力不高。选用云平台或者大厂的,往往sdk会做一些保活策略,比如和其他app共生,互相唤醒,这也是云平台的push service更有保障原因。我相信很多云平台旗下的sdk,多个使用同样sdk的app,为了实现服务存活,是可以互相唤醒和保证活跃的。另外现在push sdk本身是单连接,多app复用的,这为sdk实现,增加了新的挑战。综上,对我来说,选择推送平台,优先会考虑客户端sdk的完善程度。对于服务端,选择条件稍微简单,要求部署接入点(IDC)越要多,配合精细的选路策略,效果越有保证,至于想知道哪些云服务有多少点,这个群里来自各地的小伙伴们,可以合伙测测。go语言开发问题与解决方案下面讲下,go开发过程中遇到挑战和优化策略,给大家看下当年的一张图,在第一版优化方案上线前一天截图~可以看到,内存最高占用69G,GC时间单实例最高时候高达3~6s.这种情况下,试想一次悲剧的请求,经过了几个正在执行gc的组件,后果必然是超时… gc照成的接入方重试,又加重了系统的负担。遇到这种情况当时整个系统最差情况每隔2,3天就需要重启一次~当时出现问题,现在总结起来,大概以下几点1.散落在协程里的I/O,Buffer和对象不复用。当时(12年)由于对go的gc效率理解有限,比较奔放,程序里大量short live的协程,对内通信的很多io操作,由于不想阻塞主循环逻辑或者需要及时响应的逻辑,通过单独go协程来实现异步。这回会gc带来很多负担。针对这个问题,应尽量控制协程创建,对于长连接这种应用,本身已经有几百万并发协程情况下,很多情况没必要在各个并发协程内部做异步io,因为程序的并行度是有限,理论上做协程内做阻塞操作是没问题。如果有些需要异步执行,比如如果不异步执行,影响对用户心跳或者等待response无法响应,最好通过一个任务池,和一组常驻协程,来消耗,处理结果,通过channel再传回调用方。使用任务池还有额外的好处,可以对请求进行打包处理,提高吞吐量,并且可以加入控量策略.2.网络环境不好引起激增go协程相比较以往高并发程序,如果做不好流控,会引起协程数量激增。早期的时候也会发现,时不时有部分主机内存会远远大于其他服务器,但发现时候,所有主要profiling参数都正常了。后来发现,通信较多系统中,网络抖动阻塞是不可免的(即使是内网),对外不停accept接受新请求,但执行过程中,由于对内通信阻塞,大量协程被 创建,业务协程等待通信结果没有释放,往往瞬时会迎来协程暴涨。但这些内存在系统稳定后,virt和res都并没能彻底释放,下降后,维持高位。处理这种情况,需要增加一些流控策略,流控策略可以选择在rpc库来做,或者上面说的任务池来做,其实我感觉放在任务池里做更合理些,毕竟rpc通信库可以做读写数据的限流,但它并不清楚具体的限流策略,到底是重试还是日志还是缓存到指定队列。任务池本身就是业务逻辑相关的,它清楚针对不同的接口需要的流控限制策略。3.低效和开销大的rpc框架早期rpc通信框架比较简单,对内通信时候使用的也是短连接。这本来短连接开销和性能瓶颈超出我们预期,短连接io效率是低一些,但端口资源够,本身吞吐可以满足需要,用是没问题的,很多分层的系统,也有http短连接对内进行请求的但早期go版本,这样写程序,在一定量级情况,是支撑不住的。短连接大量临时对象和临时buffer创建,在本已经百万协程的程序中,是无法承受的。所以后续我们对我们的rpc框架作了两次调整。第二版的rpc框架,使用了连接池,通过长连接对内进行通信(复用的资源包括client和server的:编解码Buffer、Request/response),大大改善了性能。但这种在一次request和response还是占用连接的,如果网络状况ok情况下,这不是问题,足够满足需要了,但试想一个room实例要与后面的数百个的register,coordinator,saver,center,keeper实例进行通信,需要建立大量的常驻连接,每个目标机几十个连接,也有数千个连接被占用。非持续抖动时候(持续逗开多少无解),或者有延迟较高的请求时候,如果针对目标ip连接开少了,会有瞬时大量请求阻塞,连接无法得到充分利用。第三版增加了Pipeline操作,Pipeline会带来一些额外的开销,利用tcp的全双特性,以尽量少的连接完成对各个服务集群的rpc调用。4.Gc时间过长Go的Gc仍旧在持续改善中,大量对象和buffer创建,仍旧会给gc带来很大负担,尤其一个占用了25G左右的程序。之前go team的大咖邮件也告知我们,未来会让使用协程的成本更低,理论上不需要在应用层做更多的策略来缓解gc.改善方式,一种是多实例的拆分,如果公司没有端口限制,可以很快部署大量实例,减少gc时长,最直接方法。不过对于360来说,外网通常只能使用80和433。因此常规上只能开启两个实例。当然很多人给我建议能否使用SO_REUSEPORT,不过我们内核版本确实比较低,并没有实践过。另外能否模仿nginx,fork多个进程监控同样端口,至少我们目前没有这样做,主要对于我们目前进程管理上,还是独立的运行的,对外监听不同端口程序,还有配套的内部通信和管理端口,实例管理和升级上要做调整。解决gc的另两个手段,是内存池和对象池,不过最好做仔细评估和测试,内存池、对象池使用,也需要对于代码可读性与整体效率进行权衡。这种程序一定情况下会降低并行度,因为用池内资源一定要加互斥锁或者原子操作做CAS,通常原子操作实测要更快一些。CAS可以理解为可操作的更细行为粒度的锁(可以做更多CAS策略,放弃运行,防止忙等)。这种方式带来的问题是,程序的可读性会越来越像C语言,每次要malloc,各地方用完后要free,对于对象池free之前要reset,我曾经在应用层尝试做了一个分层次结构的“无锁队列”上图左边的数组实际上是一个列表,这个列表按大小将内存分块,然后使用atomic操作进行CAS。但实际要看测试数据了,池技术可以明显减少临时对象和内存的申请和释放,gc时间会减少,但加锁带来的并行度的降低,是否能给一段时间内的整体吞吐量带来提升,要做测试和权衡…在我们消息系统,实际上后续去除了部分这种黑科技,试想在百万个协程里面做自旋操作申请复用的buffer和对象,开销会很大,尤其在协程对线程多对多模型情况下,更依赖于golang本身调度策略,除非我对池增加更多的策略处理,减少忙等,感觉是在把runtime做的事情,在应用层非常不优雅的实现。普遍使用开销理论就大于收益。但对于rpc库或者codec库,任务池内部,这些开定量协程,集中处理数据的区域,可以尝试改造~对于有些固定对象复用,比如固定的心跳包什么的,可以考虑使用全局一些对象,进行复用,针对应用层数据,具体设计对象池,在部分环节去复用,可能比这种无差别的设计一个通用池更能进行效果评估.消息系统的运维及测试下面介绍消息系统的架构迭代和一些迭代经验,由于之前在其他地方有过分享,后面的会给出相关链接,下面实际做个简单介绍,感兴趣可以去链接里面看架构迭代~根据业务和集群的拆分,能解决部分灰度部署上线测试,减少点对点通信和广播通信不同产品的相互影响,针对特定的功能做独立的优化.消息系统架构和集群拆分,最基本的是拆分多实例,其次是按照业务类型对资源占用情况分类,按用户接入网络和对idc布点要求分类(目前没有条件,所有的产品都部署到全部idc)系统的测试go语言在并发测试上有独特优势。对于压力测试,目前主要针对指定的服务器,选定线上空闲的服务器做长连接压测。然后结合可视化,分析压测过程中的系统状态。但压测早期用的比较多,但实现的统计报表功能和我理想有一定差距。我觉得最近出的golang开源产品都符合这种场景,go写网络并发程序给大家带来的便利,让大家把以往为了降低复杂度,拆解或者分层协作的组件,又组合在了一起。Q&AQ1:协议栈大小,超时时间定制原则?移动网络下超时时间按产品需求通常2g,3G情况下是5分钟,wifi情况下5~8分钟。但对于个别场景,要求响应非常迅速的场景,如果连接idle超过1分钟,都会有ping,pong,来校验是否断线检测,尽快做到重新连接。Q2:消息是否持久化?消息持久化,通常是先存后发,存储用的redis,但落地用的mysql。mysql只做故障恢复使用。Q3:消息风暴怎么解决的?如果是发送情况下,普通产品是不需要限速的,对于较大产品是有发送队列做控速度,按人数,按秒进行控速度发放,发送成功再发送下一条。Q4:golang的工具链支持怎么样?我自己写过一些小程序千把行之内,确实很不错,但不知道代码量上去之后,配套的debug工具和profiling工具如何,我看上边有分享说golang自带的profiling工具还不错,那debug呢怎么样呢,官方一直没有出debug工具,gdb支持也不完善,不知你们用的什么?是这样的,我们正常就是println,我感觉基本上可以定位我所有问题,但也不排除由于并行性通过println无法复现的问题,目前来看只能靠经验了。只要常见并发尝试,经过分析是可以找到的。go很快会推出调试工具的~Q5:协议栈是基于tcp吗?是否有协议拓展功能?协议栈是tcp,整个系统tcp长连接,没有考虑扩展其功能~如果有好的经验,可以分享~Q6:问个问题,这个系统是接收上行数据的吧,系统接收上行数据后是转发给相应系统做处理么,是怎么转发呢,如果需要给客户端返回调用结果又是怎么处理呢?系统上行数据是根据协议头进行转发,协议头里面标记了产品和转发类型,在coordinator里面跟进产品和转发类型,回调用户,如果用户需要阻塞等待回复才能后续操作,那通过再发送消息,路由回用户。因为整个系统是全异步的。Q7:问个pushsdk的问题。pushsdk的单连接,多app复用方式,这样的情况下以下几个问题是如何解决的:1)系统流量统计会把所有流量都算到启动连接的应用吧?而启动应用的连接是不固定的吧?2)同一个pushsdk在不同的应用中的版本号可能不一样,这样暴露出来的接口可能有版本问题,如果用单连接模式怎么解决?流量只能算在启动的app上了,但一般这种安装率很高的app承担可能性大,常用app本身被检测和杀死可能性较少,另外消息下发量是有严格控制 的。整体上用户还是省电和省流量的。我们pushsdk尽量向上兼容,出于这个目的,push sdk本身做的工作非常有限,抽象出来一些常见的功能,纯推的系统,客户端策略目前做的很少,也有这个原因。Q8:生产系统的profiling是一直打开的么?不是一直打开,每个集群都有采样,但需要开启哪个可以后台控制。这个profling是通过接口调用。Q9:面前系统中的消息消费者可不可以分组?类似于Kafka。客户端可以订阅不同产品的消息,接受不同的分组。接入的时候进行bind或者unbind操作Q10:为什么放弃erlang,而选择go,有什么特别原因吗?我们现在用的erlang?erlang没有问题,原因是我们上线后,其他团队才做出来,经过qa一个部门对比测试,在没有显著性能提升下,选择继续使用go版本的push,作为公司基础服务。Q11:流控问题有排查过网卡配置导致的idle问题吗?流控是业务级别的流控,我们上线前对于内网的极限通信量做了测试,后续将请求在rpc库内,控制在小于内部通信开销的上限以下.在到达上限前作流控。Q12:服务的协调调度为什么选择zk有考虑过raft实现吗?golang的raft实现很多啊,比如Consul和ectd之类的。3年前,还没有后两者或者后两者没听过应该。zk当时公司内部成熟方案,不过目前来看,我们不准备用zk作结合系统的定制开发,准备用自己写的keeper代替zk,完成配置文件自动转数据结构,数据结构自动同步指定进程,同时里面可以完成很多自定义的发现和控制策略,客户端包含keeper的sdk就可以实现以上的所有监控数据,profling数据收集,配置文件更新,启动关闭等回调。完全抽象成语keeper通信sdk,keeper之间考虑用raft。Q13:负载策略是否同时在服务侧与CLIENT侧同时做的 (DISPATCHER 会返回一组IP)?另外,ROOM SERVER/REGISTER SERVER连接状态的一致性|可用性如何保证? 服务侧保活有无特别关注的地方? 安全性方面是基于TLS再加上应用层加密?会在server端做,比如重启操作前,会下发指令类型消息,让客户端进行主动行为。部分消息使用了加密策略,自定义的rsa+des,另外满足我们安全公司的需要,也定制开发很多安全加密策略。一致性是通过冷备解决的,早期考虑双写,但实时状态双写同步代价太高而且容易有脏数据,比如register挂了,调用所有room,通过重新刷入指定register来解决。Q14:这个keeper有开源打算吗?还在写,如果没耦合我们系统太多功能,一定会开源的,主要这意味着,我们所有的bind在sdk的库也需要开源~Q15:比较好奇lisence是哪个如果开源?

❸ 信息安全技术个人信息安全规范中的直接用户画像是指什么

指的是:通过收集、汇聚、分析个人信息,对某特定自然人个人特征,如其职业、经济、健康、教育、个人喜好、信用、行为等方面做出分析或预测,形成其个人特征模型的过程。

在大数据和移动互联网年代,为分析用户的群体分布特征和多样化、个性化需求,绝大部分网络运营者和网络产品、服务提供者在业务活动中均会使用用户画像(user profiling)。

何为“用户画像”?在具备强制执行效力的、与数据收集和处理相关的法律法规中均未提及该概念,而国家标准《个人信息安全规范》。

将其定义为“通过收集、汇聚、分析个人信息,对某特定自然人个人特征,如其职业、经济、健康、教育、个人喜好、信用、行为等方面做出分析或预测,形成其个人特征模型的过程。”

《个人信息安全规范》为推荐性国家标准,属于国家鼓励采用的标准,并不具有强制执行效力,监管部门不能直接援引该文件作为直接的执法依据。

但是,国家互联网信息办公室网络安全协调局在约谈“支付宝年度账单事件”当事企业负责人时,该局负责人明确指出。

支付宝、芝麻信用收集使用个人信息的方式,不符合刚刚发布的《个人信息安全规范》国家标准的精神……应严格按照网络安全法的要求,加强对支付宝平台的全面排查。

进行专项整顿,切实采取有效措施,防止类似事件再次发生。可见,在事关全民个人信息安全的热点事件中。

习惯于扩张权力边界的行政部门将推荐性标准作为强制性标准适用一般并不会受到舆论以及肇事企业的质疑。

为此,杨春宝律师团队认为,在实践中,无论对执法机关还是企业而言,《个人信息安全规范》关于用户画像的规定都具有指引性和参照性作用。

《个人信息安全规范》的内容参考了外国关于个人信息保护的相关立法,其中也包括欧盟《通用数据保护条例》(GeneralData Protection Regulation,GDPR于2018年5月25日正式施行)。

GDPR不仅适用于欧盟企业,对于在欧盟内设有分支机构的数据控制者或数据处理者,只要个人数据处理活动发生在分支机构开展活动的场景中。

即使实际的数据处理活动不在欧盟内发生,也应适用GDPR;而对于未在欧盟内设立分支机构的数据控制者或数据处理者,只要为欧盟内的数据主体提供商品或服务(无论是否支付对价)。

或监控欧盟内数据主体的行为,均应适用GDPR。因此,对于在欧盟设有分支机构、开展跨境业务、进行全球化运营的中国企业,尤其是构成《网络安全法》下的网络运营者和网络产品。

服务提供者而言,均应关注是否可能适用GDPR,关注GDPR关于用户画像的规定。

杨春宝律师团队拟通过比较分析GDPR与《个人信息安全规范》关于用户画像的相关规定,以期为相关企业合规使用用户画像提供有益参考。

❹ mysql 的sending data 和带宽有关系吗

1)explain首先怀疑索引没有建好,于是使用explain查看查询计划,结果如下:从explain的结果来看,整个语句的索引设计是没有问题的,除了第一个表因为业务需要进行整表扫描外,其它的表都是通过索引访问2)show processlist;explain看不出问题,那到底慢在哪里呢?于是想到了使用 show processlist查看sql语句执行状态,查询结果如下:发现很长一段时间,查询都处在 “Sending data”状态查询一下“Sending data”状态的含义,原来这个状态的名称很具有误导性,所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。3)show profile为了进一步验证查询的时间分布,于是使用了show profile命令来查看详细的时间分布首先打开配置:set profiling=on;执行完查询后,使用show profiles查看query id;使用show profile for query query_id查看详细信息;结果如下:从结果可以看出,Sending data的状态执行了216s4)排查对比经过以上步骤,已经确定查询慢是因为大量的时间耗费在了Sending data状态上,结合Sending data的定义,将目标聚焦在查询语句的返回列上面经过一 一排查,最后定为到一个description的列上,这个列的设计为:`description`varchar(8000) DEFAULT NULL COMMENT '游戏描述',于是采取了对比的方法,看看“不返回description的结果”如何。show profile的结果如下:可以看出,不返回description的时候,查询时间只需要15s,返回的时候,需要216s,两者相差15倍【原理研究】至此问题已经明确,但原理上我们还需要继续探究。这篇淘宝的文章很好的解释了相关原理:innodb使用大字段text,blob的一些优化建议这里的关键信息是:当Innodb的存储格式是 ROW_FORMAT=COMPACT (or ROW_FORMAT=REDUNDANT)的时候,Innodb只会存储前768字节的长度,剩余的数据存放到“溢出页”中。我们使用show table status来查看表的相关信息:可以看到,平均一行大约1.5K,也就说大约1/10行会使用“溢出存储”,一旦采用了这种方式存储,返回数据的时候本来是顺序读取的数据,就变成了随机读取了,所以导致性能急剧下降。另外,在测试过程中还发现,无论这条语句执行多少次,甚至将整个表select *几次,语句的执行速度都没有明显变化。这个表的数据和索引加起来才150M左右,而整个Innodb buffer pool有5G,缓存整张表绰绰有余,如果缓存了溢出页,性能应该大幅提高才对。但实测结果却并没有提高,因此从这个测试可以推论Innodb并没有将溢出页(overflow page)缓存到内存里面。这样的设计也是符合逻辑的,因为overflow page本来就是存放大数据的,如果也放在缓存里面,就会出现一次大数据列(blob、text、varchar)查询,可能就将所有的缓存都更新了,这样会导致其它普通的查询性能急剧下降。【解决方法】找到了问题的根本原因,解决方法也就不难了。有几种方法:1)查询时去掉description的查询,但这受限于业务的实现,可能需要业务做较大调整2)表结构优化,将descripion拆分到另外的表,这个改动较大,需要已有业务配合修改,且如果业务还是要继续查询这个description的信息,则优化后的性能也不会有很大提升。

❺ 分布式系统中应用程序怎么实现数据库读写分离

本文实例分析了Yii实现MySQL多数据库和读写分离的方法。分享给大家供大家参考。具体分析如下: Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 2.0应用开发所需要的几乎一切功能,也是最强大的框架之一,下文我们来介绍Yii实现MySQL多库和读写分离的方法 前段时间为SNS产品做了架构设计,在程序框架方面做了不少相关的压力测试,最终选定了YiiFramework,至于为什么没选用公司内部的 PHP框架,其实理由很充分,公司的框架虽然是"前辈"们辛苦的积累,但毕竟不够成熟,没有大型项目的历练,犹如一个涉世未深的年轻小伙。Yii作为一个 颇有名气开源产品,必定有很多人在使用,意味着有一批人在维护,而且在这之前,我也使用Yii开发过大型项目,Yii的设计模式和它的易扩展特性足以堪当重任。 SNS同一般的社交产品不同的就是它最终要承受大并发和大数据量的考验,架构设计时就要考虑这些问题, web分布式、负载均衡、分布式文件存储、MySQL分布式或读写分离、NoSQL以及各种缓存,这些都是必不可少的应用方案,本文所讲的就是MySQL 分库和主从读写分离在Yii的配置和使用。 Yii默认是不支持读写分离的,我们可以利用Yii的事件驱动模式来实现MySQL的读写分离。 Yii提供了一个强大的CActiveRecord数据库操作类,通过重写getDbConnection方法来实现数据库的切换,然后通过事件 beforeSave、beforeDelete、beforeFind 来实现读写服务器的切换,还需要两个配置文件dbconfig和modelconfig分别配置数据库主从服务器和model所对应的数据库名称,附代码 DBConfig.php文件如下: 复制代码 代码如下:<?php return array( 'passport' => array( 'write' => array( 'class' => 'CDbConnection', 'connectionString' => 'mysql:host=10.1.39.2;dbname=db1′, 'emulatePrepare' => true, //'enableParamLogging' => true, 'enableProfiling' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8′, 'schemaCachingDuration'=>3600, ), 'read' => array( array( 'class' => 'CDbConnection', 'connectionString' => 'mysql:host=10.1.39.3;dbname=db1, 'emulatePrepare' => true, //'enableParamLogging' => true, 'enableProfiling' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8′, 'schemaCachingDuration'=>3600, ), array( 'class' => 'CDbConnection', 'connectionString' => 'mysql:host=10.1.39.4;dbname=db3′, 'emulatePrepare' => true, //'enableParamLogging' => true, 'enableProfiling' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8′, 'schemaCachingDuration'=>3600, ), ), ), ); ModelConfig.php如下: 复制代码 代码如下:<?php return array( //key为数据库名称,value为Model 'passport' => array('User','Post'), 'microblog' => array('…'), ); ?> ActiveRecord.php如下: 复制代码 代码如下:/** * 基于CActiveRecord类的封装,实现多库和主从读写分离 * 所有Model都必须继承些类. * */ class ActiveRecord extends CActiveRecord { //model配置 public $modelConfig = ''; //数据库配置 public $dbConfig = ''; //定义一个多数据库集合 static $dataBase = array(); //当前数据库名称 public $dbName = ''; //定义库类型(读或写) public $dbType = 'read'; //'read' or 'write' /** * 在原有基础上添加了一个dbname参数 * @param string $scenario Model的应用场景 * @param string $dbname 数据库名称 */ public function __construct($scenario='insert', $dbname = '') { if (!empty($dbname)) $this->dbName = $dbname; parent::__construct($scenario); } /** * 重写父类的getDbConnection方法 * 多库和主从都在这里切换 */ public function getDbConnection() { //如果指定的数据库对象存在则直接返回 if (self::$dataBase[$this->dbName]!==null) return self::$dataBase[$this->dbName]; if ($this->dbName == 'db'){ self::$dataBase[$this->dbName] = Yii::app()->getDb(); }else{ $this->changeConn($this->dbType); } if(self::$dataBase[$this->dbName] instanceof CDbConnection){ self::$dataBase[$this->dbName]->setActive(true); return self::$dataBase[$this->dbName]; } else throw new CDbException(Yii::t('yii','Model requires a "db" CDbConnection application component.')); } /** * 获取配置文件 * @param unknown_type $type * @param unknown_type $key */ private function getConfig($type="modelConfig",$key="){ $config = Yii::app()->params[$type]; if($key) $config = $config[$key]; return $config; } /** * 获取数据库名称 */ private function getDbName(){ if($this->dbName) return $this->dbName; $modelName = get_class($this->model()); $this->modelConfig = $this->getConfig('modelConfig'); //获取model所对应的数据库名 if($this->modelConfig)foreach($this->modelConfig as $key=>$val){ if(in_array($modelName,$val)){ $dbName = $key; break; } } return $dbName; } /** * 切换数据库连接 * @param unknown_type $dbtype */ protected function changeConn($dbtype = 'read'){ if($this->dbType == $dbtype && self::$dataBase[$this->dbName] !== null) return self::$dataBase[$this->dbName]; $this->dbName = $this->getDbName(); if(Yii::app()->getComponent($this->dbName.'_'.$dbtype) !== null){ self::$dataBase[$this->dbName] = Yii::app()->getComponent($this->dbName.'_'.$dbtype); return self::$dataBase[$this->dbName]; } $this->dbConfig = $this->getConfig('dbConfig',$this->dbName); //跟据类型取对应的配置(从库是随机值) if($dbtype == 'write'){ $config = $this->dbConfig[$dbtype]; }else{ $slavekey = array_rand($this->dbConfig[$dbtype]); $config = $this->dbConfig[$dbtype][$slavekey]; } //将数据库配置加到component中 if($dbComponent = Yii::createComponent($config)){ Yii::app()->setComponent($this->dbName.'_'.$dbtype,$dbComponent); self::$dataBase[$this->dbName] = Yii::app()->getComponent($this->dbName.'_'.$dbtype); $this->dbType = $dbtype; return self::$dataBase[$this->dbName]; } else throw new CDbException(Yii::t('yii','Model requires a "changeConn" CDbConnection application component.')); } /** * 保存数据前选择 主 数据库 */ protected function beforeSave(){ parent::beforeSave(); $this->changeConn('write'); return true; } /** * 删除数据前选择 主 数据库 */ protected function beforeDelete(){ parent::beforeDelete(); $this->changeConn('write'); return true; } /** * 读取数据选择 从 数据库 */ protected function beforeFind(){ parent::beforeFind(); $this->changeConn('read'); return true; } /** * 获取master库对象 */ public function dbWrite(){ return $this->changeConn('write'); } /** * 获取slave库对象 */ public function dbRead(){ return $this->changeConn('read'); } } 这是我写好的类,放在components文件夹里,然后所有的Model都继承ActiveRecord类就可以实现多库和主从读写分离了,至于如何支持原生的SQL也同时使用读写分离,此类都已经实现。 希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

❻ 数据挖掘技术在CRM系统中的应用有哪些方面

目前,关于CRM中应用的数据挖掘技术和方法的研究有很多,不同行业、不同环境下企业的CRM应用差异很大,应用到的具体数据挖掘技术和方法也会不同。数据挖掘技术和方法层出不穷,在这里也难以涵盖全部的技术和方法。虽然,不同的CRM应用到的数据挖掘技术很多,也很复杂、但是CRM应用数据挖掘的目的主要在于以下四个方面:客户细分、获取新客户、提升客户价值和保持客户以防止流失等方面。数据挖掘在零售业CRM中主要应用在以下几方面。 一、CRM实施的前提–客户细分 客户细分就是把客户根据其性别、收入、交易行为特征等属性细分为具有不同需求和交易习惯的群体,同一群体中的客户对产品的需求的及交易心理等方面具有相似性,而不同群体间差异较大。客户群体细分可以使企业在市场营销中制定正确的营销策略,通过对不同类别客户提供有针对性的产品和服务,提高客户对企业和产品的满意度,以获取更大的利润。 客户细分可以采用分类的方法,也可以采用聚类的方法。比如,可以将客户分为高价值和低价值的客户,然后确定对分类有影响的因素,再将拥有相关属性的客户数据提取出来,选择合适的算法对数据进行处理得到分类规则。使用聚类的方法,则在之前并不知道客户可以分为几类,在将数据聚类后,再对结果数据进行分析,归纳出相似性和共性。 每一类别的客户具有相似性的属性,而不同类别客户的属性也不同,从而确定特定消费群体或个体的兴趣、消费习惯、消费倾向和消费需求,进而推断出相应消费群体或个体下一步的消费行为。细分可以让用户从比较高的层次上来察看整个数据库中的数据,也使得企业可以针对不同的客户群采取不同的营销策略,有效地利用有限的资源。合理的客户细分是实施客户关系管理的基础。 二、获取新客户–客户响应分析 在大多数商业领域中,业务发展的主要指标里都包括新客户的获取能力。新客户的获取包括发现那些对你的产品不了解的顾客,他们可能是你的产品的潜在消费者,也可能是以前接受你的竞争对手服务的顾客。在寻找新客户之前,企业应该确定哪些客户是可能的潜在客户、哪些客户容易获得、哪些客户较难获得,从而使企业有限的营销资源得到最合理的利用。因此,预测潜在客户对企业销售推广活动的反应情况是客户获得的前提,由于潜在客户的数量日益庞大,如何提高市场促销活动的针对性和效果成为获取新客户的关键问题。数据挖掘可以帮助企业识别出潜在的客户群,提高客户对市场营销活动的相应率,使企业做到心中有数、有的放矢。根据企业给定的一系列客户资料及其他输入,数据挖掘工具可以建立一个“客户反应”预测模型,利用这个模型可以计算出客户对某个营销活动的反应指标,企业根据这些指标就可以找出那些对企业所提供的服务感兴趣的客户,进而达到获取客户的目的。数据挖掘技术中的关联分析、聚类和分类功能可以很好地完成这种分析。 三、提升客户价值–交叉销售 交叉销售是指企业向原有客户销售新的产品或服务的营销过程,它不仅是通过对现有客户扩大销售来增加利润的一个有效手段,而且还是提升企业形象、培养客户忠诚度、保障企业可持续发展的重要战略。 公司与其客户之间的商业关系是一种持续的、不断发展的关系。在客户与公司建立起这种双向的商业关系之后,可以有很多种方法来优化这种关系,延长这种关系的时间。在维持这种关系期间,增加互相的接触,努力在每一次互相接触中获得更多的利润。而交叉销售就是这种工具,即向现有的客户提供新的产品和服务的过程。 在交叉销售活动中,数据挖掘可以帮助企业分析出最优的销售匹配方式。在企业所掌握的客户信息,尤其是以前购买行为的信息中,可能正包含着这个客户决定他下一个购买行为的关键,甚至决定因素。通过相关分析,数据挖掘可以帮助分析出最优的、最合理的销售匹配。一般过程是这样,首先分析现有客户的购买行为和消费习惯数据,然后用数据挖掘的一些算法对不同销售方式下的个体行为进行建模;其次是用建立的预测模型对客户将来的消费行为进行预测分析,对每一种销售方式进行评价;最后用建立的分析模型对新的客户数据进行分析,以决定向客户提供哪一种交叉销售方式最合适。有几种数据挖掘方法可以应用于交叉销售。关联规则分析,能够发现顾客倾向于关联购买哪些商品;聚类分析,能够发现对特定产品感兴趣的用户群;神经网络、回归等方法,能够预测顾客购买该新产品的可能性。 相关分析的结果可以用在交叉销售的两个方面:一方面是对于购买频率较高的商品组合,找出那些购买了组合中大部分商品的顾客,向他们推销“遗漏的”商品;另一方面是对每个顾客找出比较适用的相关规律,向他们推销对应的商品系列。 四、保持客户–客户流失分析 随着企业竞争越来越激烈,企业获取新客户的成本不断上升。对大多数企业而言,获取一个新客户的花费大大超过保持一个已有客户的费用,保持原有客户的工作越来越有价值,这已经成为大多数企业的共识。你保留一个客户的时间越长,收取你在这个客户身上所花的初期投资和获取费用的时间也越长,你从客户身上获得的利润就越多。但由于各种因素的不确定性和市场的不断增长,以及一些竞争对手的存在,很多客户为了寻求更低的费用和其他服务商为新客户提供比你更多的额外优惠条件,不断地从你这里转向另一个服务商。我们把客户从一个服务商转向到另一个服务商的行为称之为客户转移。为了分析出是哪些主要因素导致客户转移,并可以有针对性地挽留那些有离开倾向的客户,我们可以通过使用数据挖掘工具为已经流失的客户建模,识别导致他们转移的模式,然后用这些找出当前客户中可能流失的客户,以便企业针对客户的需要,采取相应的措施防止客户的流失,进而达到保持原有客户的目的。 解决客户流失问题,首先需要明确流失的客户是什么样的客户。如果流失的是劣质客户,企业求之不得;如果流失的是优质客户,企业则损失巨大。如果企业优质客户的稳定期越长,企业与其维持关系的成本越低,获得的收益越大。因此,为保持优质客户,需要先辨识优质客户。这通过前面的客户细分就可以完成这项工作,分析出客户盈利能力,辨识和预测客户的优劣。当能够辨识出客户的优劣时,首先,根据已流失客户数据,可以利用决策树,神经网络等进行分析挖掘,发现流失客户特征;然后,对现有客户消费行为进行分析,以确定每类客户流失的可能性,其中着重于发现那些具有高风险转移可能性并具有较高商业价值的客户,在这些客户转移到同行业其他服务商那里之前,采取相应的商业活动措施来保持住这些有价值的客户。我们把这个过程叫做客户保留或客户保持。 在选择数据挖掘工具时,若希望能够对客户进行细分,并且能够对客户流失的原因有比较清晰的了解,那么决策树工具是比较好的选择。尽管其他的一些数据挖掘技术,如神经元网络也可以产生很好的预测模型,但是这些模型很难理解。当用这些模型做预测分析时,很难对客户的流失原因有深入的了解,更得不到对付客户流失的任何线索。在这种情况下,也可使用细分技术和聚类技术来得到深入的了解,但用这些技术生成预测模型就相对复杂得多。一般来说,在客户保持中,大多使用分类回归决策树来生成预测模型。 综上所述,数据挖掘在CRM中有着广泛的应用,从某个角度可以说它是CRM的灵魂。通过运用数据挖掘的相关技术,发现数据中存在的关系与规则,为管理者提供重要的决策参考,用来制定准确地市场策略。并且,通过销售和服务等部门与客户交流,争取最优化的满足客户的需求,提高客户忠诚度和满意度、提升客户价值、提高企业收益,达到企业与客户的“双赢”局面。正是这一点,使得CRM得到了很大成功。 目前,关于CRM中应用的数据挖掘技术和方法的研究有很多,不同行业、不同环境下企业的CRM应用差异很大,应用到的具体数据挖掘技术和方法也会不同。数据挖掘技术和方法层出不穷,在这里也难以涵盖全部的技术和方法。

❼ vs 和 python 分析数据 哪个好

总的概括:R主要在学术界流行,python(numpy scipy)在工程方便比较实用。R是S(Splus)的开源版本,或者下一代。发源地在新西兰奥克兰。这个软件的统计背景很浓烈。我这里浓烈的意思是,如果你不熟习统计知识(历史)的话,R的帮助文档看起来是很累的。由统计背景的人开发。R的维护组叫CRAN-R。在生物信息方便,有个叫bioconctor的组织,里面有很多生物信息方面可以用的软件包,他们有一套自己维护package系统。Python是个综合语言(这里特指指CPython解释器),numpy scipy是数值计算的扩展包,pandas是主要用来做数据处理(numpy依赖),sympy做符号计算(类似mathematica?)此外还有一些不太成熟的包如sciki learn,statistical models。成熟度不如R。但是已经到了可用的水平了。是读计算机的人写的统计包。ipython 更新到1.0以后,功能基本完善,其notebook非常强大(感觉就像mathematica)而且还是基于web,在合作分享方面非常好用。性能:大家都说R慢,特别是CS的人。其实这里主要是两点:一个R里面数组的调用都是用复制的,二是Rscript慢。三是处理大数据慢。如果R用的好的话,R是不太慢的。具体来说就是Rscript用的少,多用命令,跑点小数据。这样的话,实际在跑的都是背后的fortran和C库。他们都有快二三十年历史了。可谓异常可靠,优化得不能再优化了(指单线程,如果去看源代码挥发先许多莫名的常数,永用了以后精度高速度快!)。比如一个自己编写一个R脚本,loop套loop的那种,那真是想死的心都会有。外加一点,R处理文本文件很慢!Python归根揭底还是个有解释器的脚本语言,而且有致命伤——GIL,但python最难能可贵的就是它很容易变得更快。比如pypy,cython,或者直接ctypes挂C库。纯python写个原型,然后就开是不断的profiling和加速吧。很轻易可以达到和C一个数量级的速度,但是写程序、调试的时间少了很多。并行计算:R v15 之后有了自带的parallel包,用挺轻松的。不过其实就是不停的fork,或者mpi,内存消耗挺厉害的。parSapply,parApply什么的,真是很好用。Python虽然有GIL——并行计算的死敌,但是有multiprocessing(fork依赖) ,是可以共享数据的什么的,估计内存消耗方面比R好点,数据零散的话overhead很多。到了MPI的话,mpi4py还是挺好用的。用cython的话结合openmp可以打破GIL,但是过程中不能调用python的对象。学习曲线:假设什么编程都不会的同学。 R一开始还是很容易上手的,查到基本的命令,包,直接print一下就有结果了。但是如果要自己写算法、优化性能的时候,学习难度陡增。Python么,挺好学的,绝大多数的帮助文档都比R好了许多。有些包用起来没R方便。总的来说深入吼R陡。扩展资源:基本上新的统计方法都会有R的package,安装实用都不麻烦。但是基本上都是搞统计的人写的计算机包。所以效能上可能有问好。比较出名的有两个包的管理网站,cran-r 和bioconctor。 所以搞生化的估计R用起来很方便。python的统计计算包们比R少,多很年轻,还在不断的开发中。优于是计算机人写的统计包,用起来的时候要多涨个心眼。画图:R自带的那些工具就挺好用了,然后还有ggplot这种非常优美的得力工具。python 有matplotlib,画出来效果感觉比R自带的好一些些,而且界面基于QT,跨平台支持。可能是R用得多了,pyplot用起来还是不太顺手,觉得其各个组建的统一性不高。IDE:Rstudio非常不错,提供类matlab环境。(用过vim-r-plugin,用过emacs + ess现在用vim。)windows 下有python(x,y) 还有许多商业的工具。(本人现在的emacs环境还不是很顺手~)建议:如果只是处理(小)数据的,用R。结果更可靠,速度可以接受,上手方便,多有现成的命令、程序可以用。要自己搞个算法、处理大数据、计算量大的,用python。开发效率高,一切尽在掌握。ps:盲目地用R的包比盲目的地用python的包要更安全。起码R会把你指向一篇论文,而python只是指向一堆代码。R出问题了还有论文作者、审稿人陪葬。

❽ 如何使用OpenStack,Docker和Spark打造一个云服务

从一项颠覆性的技术成果转化并衍生出一整套社区体系,Docker在发展速度上打破了一个又一个历史纪录。然而,Docker项目在采纳与普及方面表现出惊人态势的同时,也给我们带来了一系列疑问与困惑。在今天的文章中,我希望将注意力集中在朋友们最为关注的评论议题身上。随着Docker项目在人气方面的持续飙升,很快刚刚接触这一新生事物的读者在实践过程中不禁产生了这样的疑问:如果已经决定使用Docker,是否还有必要同时使用OpenStack?在给出自己的观点之前,我打算首先就背景信息入手为各位进行讲解,从而更为透彻地认清这个命题背后所隐藏的理论基础。背景信息从最为简单的构成形式出发,Docker实际上旨在提供一套能够在共享式基础设施之上对软件工作负载进行管理的容器环境,但同时又确保不同负载之间彼此隔离且互不影响。以KVM为代表的虚拟机系统所做的工作也差不多:创建一套完整的操作系统堆栈,通过虚拟机管理程序将与该系统相关的设备囊括进来。然而与虚拟机解决方案的区别在于,Docker在很大程度上依赖于Linux操作系统所内置的一项功能——名为LXC(即Linux容器)。LXC利用内置于操作系统当中的各项功能将不同进程的内存进行划分,甚至能够在一定程度上拆分CPU与网络资源。Docker镜像不需要像一套全新操作系统那样进行完整的引导过程,这样一来软件包的体积就能得到大幅压缩、应用程序运行在共享式计算资源之上时也将具备更为显著的轻量化优势。除此之外,Docker还允许工作负载直接访问设备驱动程序、从而带来远超过虚拟机管理程序方案的I/O运行速度。在这种情况下,我们得以直接在裸机设备上使用Docker,而这就带来了前面提到的核心问题:如果已经使用了Docker,我们还有必要同时使用OpenStack等云方案吗?前面的结论绝非信口开河,BodenRussell最近针对Docker与KVM等虚拟机管理程序在性能表现上的差异进行了基准测试,并在DockerCon大会上公布了测试结果。本次基准测试提供相当详尽的具体数据,而且如预期一样,测试结果显示引导KVM虚拟机管理程序与引导Docker容器之间存在着显著的时间消耗差异。本次测试同时表明,二者之间在内在与CPU利用率方面同样存在着巨大区别,具体情况如下图所示。红色线条为KVM,蓝色线条为Docker。这种在性能表现上的显著区别代表着两套目的相近的解决方案在资源密度与整体利用率方面大相径庭。而这样的差异也将直接体现在运行特定工作负载所需要的资源总量上,并最终反映到实际使用成本当中。结论整理·上述结论并不单纯指向OpenStack,但却适用于OpenStack以及其它与之类似的云基础设施解决方案。在我看来,之所以问题的矛头往往最终会被指向OpenStack,是因为OpenStack项目事实上已经在私有云环境领域具备相当高的人气,同时也是目前我们惟一会考虑作为Docker替代方案的技术成果。·问题的核心不在于OpenStack,而在于虚拟机管理程序!很多性能基准测试都将Docker与KVM放在了天秤的两端,但却很少将OpenStack牵涉于其中。事实上,前面提到的这次专项基准测试同时将OpenStack运行在KVM镜像与Docker容器环境之下,结果显示这两类技术成果能够带来理想的协作效果。考虑到这样的情况,当我们选择将OpenStack运行在基于Docker的Nova堆栈当中时——正如OpenStack说明文档提供的下图所示——那些资源利用率参数将变得无关紧要。·在这种情况下,云基础设施能够在容器或者虚拟机管理程序当中提供一套完整的数据中心管理解决方案,而这仅仅属于庞大系统整体当中的组成部分之一。以OpenStack为代表的云基础设施方案当中包含多租户安全性与隔离、管理与监控、存储及网络外加其它多种功能设置。任何云/数据中心管理体系都不能脱离这些服务而独立存在,但对于Docker或者是KVM基础环境却不会做出过多要求。·就目前来讲,Docker还不算是一套功能全面的虚拟化环境,在安全性方面存在多种严重局限,缺乏对Windows系统的支持能力,而且因此暂时无法作为一套真正可行的KVM备用方案。尽管正在持续进行当中的后续开发工作将逐步弥合这些差距,但抱持着相对保守的心态,这些问题的解决恐怕也同时意味着容器技术将在性能表现方面有所妥协。·另外需要注意的是,原始虚拟机管理程序与经过容器化的实际应用程序性能同样存在着巨大差异,而且下面这幅来自基准测试的图表清楚地说明了这一点。目前可能合理的解释在于,应用程序通常会利用缓存技术来降低I/O资源开销,而这大大影响了测试结果对真实环境中运行状态的准确反映。·如果我们将Docker容器打包在KVM镜像当中,那么二者之间的差异将变得可以忽略不计。这套架构通常利用虚拟机管理程序负责对云计算资源的控制,同时利用Heat、Cloudify或者Kubernetes等流程层在虚拟机资源的容纳范围之内进行容器管理。总结由此我得出了这样的结论:要想正确地看待OpenStack、KVM以及Docker三者之间的关系,正确的出发点是将其视为一整套辅助堆栈——其中OpenStack扮演整体数据中心管理方案的角色,KVM作为多租户计算资源管理工具,而Docker容器则负责与应用部署包相关的工作。在这样的情况下,我们可以汇总出一套通用型解决模式,其中Docker分别充当以下几种角色:·Docker提供经过认证的软件包,并保证其能够与稳定不变的现有基础设施模型顺利协作。·Docker为微服务POD提供出色的容器化运行环境。·在OpenStack之上使用Docker,并将其作用与裸机环境等同的运行平台。前面说了这么多,我确实亲眼见证过不少经过精确定义的工作负载实例,对于它们来说是否使用云基础设施仅仅是种自由选项而非强制要求。举例来说,如果我出于DevOps的目的而考虑建立一套小型自动化开发与测试环境,那么我个人更倾向于在裸机环境上直接使用Docker机制。而虚拟机与容器这两类环境之间,流程层将成为一套绝佳的抽象对接工具。将流程框架与Docker共同使用的一大优势在于,我们能够根据实际需求、随时在OpenStack以及裸机环境之间进行切换。通过这种方式,我们将能够选择任意一种解决选项——只要其切实符合我们流程引擎对于目标环境的具体需要。OpenStackOrchestration(即Heat)在最新发布的Icehouse版本当中已经明确表示支持Docker环境。Cloudify作为一款基于TOSCA的开源流程框架,原本适用于OpenStack以及VMware、AWS乃至裸机等云环境,而最近也开始将Docker支持纳入自身。谷歌Kubernetes主要面向的是GCE协作目标,但我们也能够通过自定义来使其适应其它云或者运行环境。

❾ CRM软件主要是做什么的

CRM是客户关系管理的意思,主要定义为:企业为提高核心竞争力,利用相应的信息技术以及互联网技术来协调企业与顾客间在销售、营销和服务上的交互,从而提升其管理方式,向客户提供创新式的个性化的客户交互和服务的过程。其最终目标是吸引新客户、保留老客户以及将已有客户转为忠实客户,增加市场份额。CRM的作用:1.提高市场营销效果2.为生产研发提供决策支持3.提供技术支持的重要手段4.为财务金融策略提供决策支持5.为适时调整内部管理提供依据6.使企业的资源得到合理利用7.优化企业业务流程8.提高企业的快速响应和应变能力9.改善企业服务,提高客户满意度10.提高企业的销售收入11.推动了企业文化的变革12.与QQ集成,可以快速与客户沟通。

赞(0)