随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨后春笋,随之而来的LBS服务定位问题成为了后端服务的一个挑战。MongoDB对LBS查询的支持较为友好,也是各大LBS服务商的首选数据库。腾讯云MongoDB团队在运营中发现,原生MongoDB在LBS服务场景下有较大的性能瓶颈,经腾讯云团队专业的定位分析与优化后,云MongoDB在LBS服务的综合性能上,有10倍以上的提升。
腾讯云MongoDB提供的优异综合性能,为国内各大LBS服务商,例如摩拜单车等,提供了强有力的保障。
LBS业务特点
以共享单车服务为例,LBS业务具有2个特点,分别是时间周期性和坐标分布不均匀。
一.时间周期性
高峰期与低谷期的QPS量相差明显,并且高峰期和低峰期的时间点相对固定。
二.坐标分布不均匀
坐地铁的上班族,如果留意可能会发现,在上班早高峰时,地铁周围摆满了共享单车,而下班 时段,地铁周围的共享单车数量非常少。如下图,经纬度(121,31.44)附近集中了99%以上 的坐标。此外,一些特殊事件也会造成点的分布不均匀,例如深圳湾公园在特殊家假日涌入大量的客户,同时这个地域也会投放大量的单车。部分地域单车量非常集中,而其他地域就非常稀疏。
MongoDB的LBS服务原理
MongoDB中使用2d_index 或2d_sphere_index来创建地理位置索引(geoIndex),两者差别不大,下面我们以2d_index为例来介绍。
一.2D索引的创建与使用
通过上述命令来查询一个索引,其中spherical:true|false 表示应该如何理解创建的2d索引,false表示将索引理解为平面2d索引,true表示将索引理解为球面经纬度索引。这一点比较有意思,一个2d索引可以表达两种含义,而不同的含义是在查询时被理解的,而不是在索引创建时。
二.2D索引的理论
MongoDB 使用GeoHash的技术来构建2d索引(见wiki geohash 文字链)。MongoDB使用平面四叉树划分的方式来生成GeoHashId,每条记录有一个GeoHashId,通过GeoHashId->RecordId的索引映射方式存储在Btree中
很显然的,一个2bits的精度能把平面分为4个grid,一个4bits的精度能把平面分为16个grid。
2d索引的默认精度是长宽各为26,索引把地球分为(2^26)(2^26)块,每一块的边长估算为2PI6371000/(1<<26) = 0.57 米
mongodb的官网上说的60cm的精度就是这么估算出来的
By default, a 2d index on legacy coordinate pairs uses 26 bits of precision, which isroughly equivalent to 2 feet or 60 centimeters of precision using the default range of-180 to 180
三.2D索引在Mongodb中的存储
上面我们讲到Mongodb使用平面四叉树的方式计算Geohash。事实上,平面四叉树仅存在于运算的过程中,在实际存储中并不会被使用到。
对于一个经纬度坐标[x,y],MongoDb计算出该坐标在2d平面内的grid编号,该编号为是一个52bit的int64类型,该类型被用作btree的key,因此实际数据是按照 {GeoHashId->RecordValue}的方式被插入到btree中的。
查询
对于geo2D索引的查询,常用的有geoNear和geowithin两种。geoNear查找距离某个点最近的N个点的坐标并返回,该需求可以说是构成了LBS服务的基础(陌陌,滴滴,摩拜),geoWithin是查询一个多边形内的所有点并返回。我们着重介绍使用最广泛的geoNear查询。
geoNear的查询过程,查询语句如下
geoNear可以理解为一个从起始点开始的不断向外扩散的环形搜索过程。如下图所示:
由于圆自身的性质,外环的任意点到圆心的距离一定大于内环任意点到圆心的距离,所以以圆
环进行扩张迭代的好处是:
1)减少需要排序比较的点的个数
2)能够尽早发现满足条件的点从而返回,避免不必要的搜索
MongoDB在实现的细节中,如果内环搜索到的点数过少,圆环每次扩张的步长会倍增
MongoDB LBS服务遇到的问题
部分大客户在使用MongoDB的geoNear功能查找附近的对象时,经常会发生慢查询较多的问题,早高峰压力是低谷时段的10-20倍,坐标不均匀的情况慢查询严重,濒临雪崩。初步分析发现,这些查询扫描了过多的点集。
如下图,查找500米范围内,距离最近的10条记录,花费了500ms,扫描了24000+的记录。类似的慢查询占据了高峰期5%左右的查询量
测试环境复现与定位
排查数据库的性能问题,主要从锁等待,IO等待,CPU消耗三封面分析。上面的截图扫描了过多的记录,直觉上是CPU或者IO消耗性的瓶颈。为了严谨起见,我们在测试环境复现后,发现慢日志中无明显的timeAcquiringMicroseconds项排除了MongoDB执行层面的锁竞争问题,并选用较大内存的机器使得数据常驻内存,发现上述用例依旧需要200ms以上的执行时间。10核的CPU资源针对截图中的case,只能支持50QPS。
为何扫描集如此大
上面我们说过,MongoDB搜索距离最近的点的过程是一个环形扩张的过程,如果内环满足条件的点不够多,每次的扩张半径都会倍增。因此在遇到内环点稀少,外环有密集点的场景时,容易陷入BadCase。如下图,我们希望找到离中心点距离最近的三个点。由于圆环扩张太快,外环做了很多的无用扫描与排序。
这样的用例很符合实际场景,早高峰车辆聚集在地铁周围,你从家出发一路向地铁,边走边找,共享单车软件上动态搜索距你最近的10辆车,附近只有三两辆,于是扩大搜索半径到地铁周围,将地铁周围的所有几千辆车都扫描计算一遍,返回距离你最近的其余的七八辆
问题的解决
问题我们已经知道了,我们对此的优化方式是控制每一圈的搜索量,为此我们为geoNear命令增加了两个参数,将其传入NearStage中。hintCorrectNum可以控制结果品质的下限,返回的前N个一定是最靠近中心点的N个点。hintScan用以控制扫描集的大小的上限。
hintScan: 已经扫描的点集大小大于hintScan后,做模糊处理。
hintCorrectNum:已经返回的结果数大于hintCorrectNum后,做模糊处理。
该优化本质上是通过牺牲品质来尽快返回结果。对于国内大部分LBS服务来说,完全的严格最近并不是必要的。且可以通过控制参数获得严格最近的效果。在搜索过程中,密集的点落到一个环内,本身距离相差也不会不大。该优化在上线后,将部分大客户的MongoDB性能上限从单机1000QPS提升了10倍到10000QPS以上。
和Redis3.2的对比
Redis3.2也加入了地理位置查询的功能,我们也将开源Redis和云数据库MongoDB进行对比。
Redis使用方式:GEORADIUS appname 120.993965 31.449034 500 m count 30 asc。在密集数据集场景下,使用腾讯云MongoDB和开源的Redis进行了性能对比。下图是在密集数据集上,在24核CPU机器上,MongoDB单实例与Redis单实例的测试对比。需要注意的是Redis本身是单线程的内存缓存数据库。MongoDB是多线程的高可用持久化的数据库,两者的使用场景有较大不同。
总结
MongoDB原生的geoNear接口是国内各大LBS应用的主流选择。原生MongoDB在点集稠密的情况下,geoNear接口效率会急剧下降,单机甚至不到1000QPS。腾讯云MongoDB团队对此进行了持续的优化,在不影响效果的前提下,geoNear的效率有10倍以上的提升,为我们的客户如摩拜提供了强力的支持,同时相比Redis3.2也有较大的性能优势。
原文链接:
戳这里,看该作者更多好文
Scala中的Seq和List之间的区别
Scala的Seq将是Java的List,Scala的List将是Java的LinkedList。 请注意,Seq是一个trait,它相当于Java的接口,但相当于即将到来的防御者方法。 Scala的List是一个抽象类,由Nil和::扩展,这是List的具体实现。 所以,在Java的List是一个接口,Scala的List是一个实现。 除此之外,Scala的List是不可变的,这不是LinkedList的情况。 事实上,Java没有等价的不可变集合(只读的东西只保证新的对象不能改变,但你仍然可以改变旧的,因此,“只读”一个)。 Scala的List是由编译器和库高度优化的,它是函数式编程中的基本数据类型。 然而,它有限制,它不足以并行编程。 这些天,Vector是一个比List更好的选择,但习惯是很难打破。 Seq是一个很好的泛化序列,所以如果你编程到接口,你应该使用它。 注意,实际上有三个,和,它是后一个是“默认”导入到范围。 还有GenSeq和ParSeq。 后面的方法在可能的情况下并行运行,前者是Seq和ParSeq的父代,这是当代码的并行性无关紧要的合适的泛化。 它们都是相对新引入的,因此人们不会使用它们。
计算机有几种
计算机的分类如下:
1、按计算机处理数据的方式分类:分为电子数字计算机、电子模拟计算机和数模混合计算机。
2、按计算机使用范围分类:通用计算机与专用计算机。
3、按计算机的规模和处理能力分类:分为巨型机、大型机、中型机、小型机、微型机和工作站等。
网游公司的服务器与我们用PC差不多,只不过它们的内存、硬盘要大的多,处理数据的能力更强大,稳定性能更好。 象如PC机安装了服务器系统后,也可做各种服务器。 现在互联网上服务器大多都是PC机来充当的,要求这样的机器比我们平时用的性能要好,更为稳定。
市场部与销售部它们之间有什么样的区别和联系?
(转载)一起学习! 许多人都有过这样的疑惑:为什么有的企业已经有了销售部,还要再弄一个市场部?它们不重叠吗?解释了许多人还是不太明白.看到这篇文章,推荐给大家研究. 市场部关注的是整体市场的均衡,可持续发展;具体的工作包括市场研究,品牌宣传,销售促进活动的策划和实施以及销售员培训等;销售部关注的是每期的销售业绩和利润;具体工作就是拜访客户,推荐产品等。 关于市场部和销售部的功能和职责问题,现在很多企业,甚至包括一些营销工作者仍然纠缠不清,现在很多公司都设立了营销部与销售部;策划部,市场推广部和销售部;企划部,品牌推广部和销售部等等,根据本人的理解,其实这些概念部门不应该并列,正确的应该是营销部门下设市场部和销售部,上面并列的哪个营销部其实在的功能应该是市场部的工作.而策划,市场推广,品牌推广也好,应该是属于市场部的工作.而营销工作者也往往把“销售”(一般认为是比较低级的市场运作)和“营销”(一般认为较高级阶段的市场运作)作为一种层次上的区别. 营销涉及的范围很大,在此我不想多做阐述,只想说一下市场部与销售部的工作区别: 1.工作目标: 市场部的目标是树立品牌,扩大品牌知名度、提升美誉度,给消费者提供产品购买的理由和刺激,而销售部的工作目标就是如何把产品送到消费者的面前,并成功的收回资金,实现商品的价值; 2.层次: 市场与销售就是“战略”和“战术”的关系,市场部涉及销售的方方面面,包括销售前,中,后的市场调查;营销方案的制定;产品定位和品牌推广方案;价格制定;渠道开发和促销的政策制定;售后服务政策等等,是全局统筹的工作,是战略层面的事情.销售部工作主要是将市场部研究规划出的产品按设计好的渠道和价格以及促销宣传方式具体实施,管好渠道畅通,物流、资金流安全畅通即可。 是战术实施方面的事情。 一个是策略制定,一个是执行,形象一点就是人的脑部与手脚的关系; 3.全局和局部: 市场部考虑的是全局性的,所代表的就是整体利益。 因此除了销量外,还有品牌知名度、品牌美誉度等。 考核标准也是难以确定和具体量化的。 而销售部的工作就是体现在货物的销售和回款的多寡; 4.理论和实践: 由于两个部门的工作内容个性质不同,市场部往往是进行的务虚的“理论工作”,销售部往往进行的是“务实的实践工作”; 5.长远利益和短期利益: 市场部的市场策略研究、品牌规划建设一般都是以年度、五年度甚至十年度为一个检验周期。 所以关系的是企业长远的利益。 而销售部的销售往往是以月、季度、最多是年度为单位的。 所以关系到的是企业的短期利益。 企业的销售部门与市场部门是企业营销的两大基本职能部门。 市场部门的任务是解决市场对企业产品的需求问题,销售部门的任务是解决市场能不能买到产品的问题,这两个问题同时作用于市场,就是我们今天所做的市场营销工作。 市场是企业的龙头,是企业实现产品变成资金、变成利润的主要职能部门;企业生产产品数量、生产产品品种、生产产品规格、产品包装、产品外观等等必须以市场为导向。 这些观念已被我们的国内企业接受。 有的国内企业已将这些观念在市场实战运用自如,倍尝甜头。 但是,到了20世纪末,一切都在快速发展,于是股东、企业、企业家、职业经理人又觉得这样销售太慢,在寻找诸如“肥*粉”、“丰乳剂”之类的快速成长添加剂加速销售额、销售量的增长,实现利润的最大化。 企业纷纷设立市场部或企划部,进行了第二次营销行动。 将广告、策划、宣传、创意、品牌、形象、市场定位等视为神明,认为“广告一响,黄金万两”。 有的企业运用市场及广告到了惊天动地的地步,一年之内投入广告一个亿、五个亿已经司空见惯。 纵观百年国际著名消费品公司,都是一步一个台阶、一步一个脚印地发展市场,稳步地增长销售。 这些公司有一个共同的营销特征,就是销售与市场二者之间协调的很好,既重视销售,又重视市场,将“拉”与“推”二种力量有机地结合了起来。 一、市场部的职责 市场部的主要职责有十五大方面。 01、制定年度营销目标计划。 02、建立和完善营销信息收集、处理、交流及保密系统。 03、对消费者购买心理和行为的调查。 04、对竞争品牌产品的性能、价格、促销手段等小的收集、整理和分析。 05、对竞争品牌广告策略、竞争手段的分析。 06、做出销售预测,提出未来市场的分析、发展方向和规划。 07、制定产品企划策略。 08、制定产品价格。 09、新产品上市规划。 10、制定通路计划及个阶段实施目标。 11、促销活动的策划及组织。 12、合理进行广告媒体和代理上的挑选及管理。 13、制定及实施市场广告推广活动和公关活动。 14、实施品牌规划和品牌的形象建设。 15、负责产销的协调工作。 市场部在产品不同阶段侧重点各有不同。 1.在产品导入期,市场部的职责重点有:对消费者购买心理行为的调查;制定产品上市规划;制定通路计划及个阶段实施目标;制定产品价格;制定产品企划策略。 2.在产品成长期,市场部的职责重点有:建立和完善营销信息收集、处理、交流及保密系统;制定年度营销目标计划;负责产销的协调工作。 3.在产品成熟期,市场部的职责重点有:对竞争品牌广告策略、竞争手段的分析。 对销售预测,提出未来市场的分析、发展方向和规划。 制定产品企划策略。 制定广告策略。 实施品牌规划。 二、市场部经理的职责 市场部经理全面负责市场部门的业务及人员管理,其具体职责是: 01、全面计划、安排、管理市场部工作。 02、制定年度营销策略和营销计划。 03、协调部门内部与其他部门之间的合作关系。 04、制定市场部的工作规范、行为准则及奖励制度。 05、指导、检查、控制本部门各项工作的实施。 06、配合人力资源部对市场人员的培训、考核、调配。 07、拟订并监督执行市场规划与预算。 08、拟订并监督执行公关及促销活动计划,计划安排年、季、月及专项市场推广策划。 09、制定广告策略,包括年、季、月及特定活动的广告计划。 10、对市场进行科学的预测和分析,并为产品的开发、生产及投放市场做出准备。 11、拟订并监督执行市场调研计划。 12、拟订并监督执行新产品上市计划和预算。 13、制定各项费用的申报及审核程序。 三、市场调研主管的职责 01、负责市场调研计划的制定及实施。 02、建立健全营销信息系统,制定内部信息、市场情报收集、整理、分析、交流及保密制度。 03、为本部门和其他部门提供信息决策支持。 04、协助市场部经理制定各项市场营销计划。 05、组织进行宏观环境及行业状况调研。 06、组织对企业内部营销环境调研。 07、组织对消费者及用户调研。 08、对配销渠道的调研。 09、收集竞争厂家的市场情报和各级政府、业界团体、学会发布的行业政策和信息。 10、提出新产品开发提案。 四、市场部营业企划主管的职责 01、制定各种不同的通路配置计划。 02、负责竞争产品信息的整理与分类。 03、制定产品的分销计划。 04、制定通路现在与培训、激励和控制政策。 05、定期分析、评估通路。 06、与销售部及时沟通每月销量计划并适量安排生产。 07、控制产成品、包装式样和库存数量。 08、控制物流并适时同胞促销计划。 五、市场部产品企划主管的职责 01、根据企业发展规划,判定产品年度、阅读性规划。 02、负责产品开发,并与研发、生产、采购、财务等部门共同进行产品商业化运作企划。 03、负责产品全方位企划,包括价格企划、包装企划、通路企划、延伸企划。 04、协助广告及促销企划部门进行产品广告及促销企划。 六、市场部广告企划主管的职责 01、制定年、季、月度广告费用计划。 02、负责企业各项产品、公关活动的策划与执行。 03、正确地选择广告公司。 04、督导广告及制作代理公司的工作。 05、制定产品不同时期的广告策略。 06、进行广告检测与统计,并保持与生产调研主管的业务沟通。 07、及时进行广告、公关活动的效果评估。 七、市场部促销企划主管的职责 01、根据公司的整体规划,进行年度、季度、月度及节假日的各种促销活动。 02、负责拟订各种促销方案,并监督各种促销方案的实施与效果的评估。 03、指导、监督个区域市场促销活动计划的拟订和实施,制定市场促销活动经费的申报以及审批程序,并对该项程序予以监督。 04、促销品的设计、制作及发放管理。 05、区域销量的分析统计及提出推进计划。 06、制定不同时期、不同促销活动的各项预算,并依据预算控制促销经费的使用。 八、市场部推广制作主管的职责 01、制定年度推广计划。 02、负责个商场专柜、专卖店的美术设计与制作以及POP的设计与制作。 03、负责各种推广方案的制定。 04、推广制作费用预算与控制。 05、负责各种推广方案的实施,并对方案的实施予以监督,并进行销售的评估。 九、市场部理货员职责 01、安排固定的走街拜访线路。 02、直接拜访零售店客户。 03、完成商品化陈列工作,有效进行陈列位置、空间位置、地面陈列的管理。 04、进行有效第购买点援助器材的张贴、悬挂及陈列。 05、培育零售商店对于商品化陈列工作的积极态度和对深度分销的较多认识。 06、积极了解并获得竞争对手的各种信息,积极利用有效渠道对相关信息进行反馈并提出建议。 07、建立良好的客户关系,保持亲善的态度,树立公司的专业形象。 08、积极有效利用促销资金,以最经济的方式运作并保持高效率。 09、完整、准确、及时地制作、呈报各类报表。 10、在市场代表的指导下,管理促销人员。 十、市场部与销售部的配合 市场部应将以下企划提供给销售部,并作必要的说明、培训及研讨: 01、销售促进计划。 02、促销活动/公关活动计划及安排。 检查及沟通终端市场活化状况。 03、POP投放计划。 促销/公关礼品发放计划。 04、年、季度、月销售目标制定。 05、产品市场占有率及品牌推广计划。 销售部应将以下工作向市场部提供: 01、终端产品陈列情况。 02、产品理货情况。 03、POP发放情况。 04、网点开发、覆盖率情况。 05、终端销售情况。 06、终端促销信息反馈。 07、区域销售状况。 08、竞争品牌市场信息反馈。 09、客户反馈。 销售部不仅要完成每月销售计划,还要反馈市场信息状况及竞品情况,以便市场部根据不同时期的变化指数预测未来市场产品需求走向,制定下月及调整下季度生产计划。 销售部在完成把产品有效送达销售终端的同时,要配合市场部达成有效推广,使消费者不仅能看到产品,而且能够产生购买欲望。 所以,对销售终端的活化宣传,如产品摆放、促销活动配合、POP的配合宣传都是销售部人才工作范围,也是与市场部沟通较多的环节之一。 产品理货是业务代表最基本的工作,它的好坏直接影响产品在末端的销售,同时也会影响产品在消费者心中的信誉,所以它已经不单纯是简单的销售问题,与品牌的形象有关,也是涉及市场部管理的内容,因此要有这方面的沟通。 总之,销售部在市场前沿涉及品牌及企业长期性发展因素,销售部要与市场人员进行正常的沟通。
发表评论