多线程、事件驱动与推荐引擎框架选型

  • 时间:
  • 浏览:1
  • 来源:大发11选5_大发11选5官网

  最近 Nebula 将会用于一一4个新的生产项目——推荐引擎,在此原先团队已有使用某知名度较高的RPC框架多任务管理器运行版推荐引擎(业界这种推荐引擎都用了目前比较知名的开源RPC框架来开发)。本文不做Nebula与各知名RPC框架的比较,也无意说明哪个框架更适合做推荐引擎,只说明Nebula可不还都能否用于推荐引擎,且有信心效果会很好。最终结果如何,等推荐引擎研发出来,拭目以待。

  这种意义上说,服务端任务管理器运行大多是事件驱动的,将会说是IO请求事件驱动的。这里比较的编程模型里的事件驱动是指事件除理每项是异步的,即不仅IO请求事件驱动,还有IO响应事件驱动,它的特点是当内部管理IO响应事件存在时使用回调机制来触发相应的除理。

  多任务管理器运行运行的前三点都不 优点,第四点是缺点。Nebula选则多任务管理器运行运行就不时需考虑锁和同步资源问题,数据和错误隔离,worker任务管理器运行运行崩溃很多影响整个节点服务,会被master任务管理器运行运行好快拉起。第四点缺点在Nebula不时需考虑,将会Nebula事件驱动的任务管理器运行运行之间是不时需切换的,可不还都能否近似地认为每个worker任务管理器运行运行都不 一一4个节点,节点与节点之间不到网络通信,不时需共享资源更不时需做切换。

  高性能通用型C++网络框架 Nebula 是基于事件驱动的多任务管理器运行运行网络框架(适用于即时通讯、数据派发、实时计算、消息推送等应用场景),已有即时通讯、派发数据派发及实时节 析的生产应用案例。突然村里人 问Nebula的每个任务管理器运行运行里是单任务管理器运行还是多任务管理器运行的?又问为哪几种很多多任务管理器运行?很多多任务管理器运行又为甚会么会除理并发问题?

  为哪几种是事件驱动而都不 多任务管理器运行?事件驱动未必多任务管理器运行。亲戚亲戚朋友先来回顾一下服务器编程范式。

  Nebula 适用于即时通讯、数据派发、实时计算、消息推送等应用场景,也适用于web后台服务。Nebula已有即时通讯、派发数据派发及实时节 析的生产应用案例,快一点 将有一一4个面向亿级用户的推荐引擎生产应用案例。

  多任务管理器运行运行:

  Nebula是Bwar开发的C++网络框架,生而为分布式服务,经过一一4个生产环境的应用。Nebula都不 rpc框架只是一一4个基proactor(框架层实现proactor而非操作系统支持)事件驱动(回调)的框架。未必像大多数异步事件回调框架那样开发者时需个人注册回调函数,Nebula一起去也是个IoC框架,通过actor类的巧妙设计实现降低了异步编程的复杂度,开发者真正意义上只需聚焦业务逻辑开发。

  在单任务管理器运行同步模型中,任务按照顺序执行。将会某个任务将会I/O而阻塞,这种所有的任务都时需等待,直到它完成原先它们能够依次执行。这种明确的执行顺序和串行化除理的行为是很容易推断得出的。将会任务之间并这么互相依赖的关系,但仍然时需互相等待一句话这就使得任务管理器运行未必要的降低了运行强度。

  Nebula框架提供的Cmd类非常适合推荐服务的逻辑入口,支持动态加载,随时不停机升级推荐算法推荐模型。Step类异步获取redis等存储中的数据,无阻塞等待让cpu资源只用于推荐逻辑。session类用于缓存用户、item、模型等数据。所有的数据获取、传递均可通过session智能指针十分方便而高效地得到。

参考资料:

  说到推荐系统,首先被想到的将会是基于内容、协同过滤、基于人口统计学、基于知识、基于社区、混合推荐等推荐技术。推荐技术的实施通常基于hadoop,用hive、spark、storm、flink等来实现。哪几种通常被称为推荐的数据挖掘每项。

  在哪几种基于rpc框架的推荐引擎中,这种开发人员提到了反射功能,否则 通过大量宏以很费劲不难 理解的土办法实现了所谓的反射功能。哪几种都都不 IoC框架,Bwar不理解为哪几种时需实现反射功能,将会用Nebula来做将是非常简单的事,Nebula是IoC框架,所有的actor实例创建都不 通过反射创建的,未必开发者做业务逻辑之外的任何事情。Nebula的反射实现很优雅,将会感兴趣,可不还都能否参考这篇文章《C++反射机制:可变参数模板实现C++反射》。

  《UNIX网络编程》卷一里介绍了9种服务器设计范式:

  推荐引擎是推荐系统核心之一,负责将数据挖掘的结果按一定排序推送给用户,这只是推荐引擎的主要功能。

  多任务管理器运行:

  九种服务器设计范式并都不 什么都有不 实用价值,在《UNIX网络编程》卷一最后一节里给出了几种TCP服务器设计范式代码示例:

  对于IO密集型的业务,事件驱动比多任务管理器运行同步的并发能力要高什么都有,可不还都能否说都不 一一4个数量级的。而大每项互联网业务都属于IO密集型业务,否则 事件驱动的适用场景非常广泛。任务管理器运行富含这种强度独立的任务,等待事件到来时,这种任务会阻塞,单个任务时需占用较少CPU资源。

  事件驱动编程是这种编程范式,这里任务管理器运行的执行流由内部管理事件来决定。它的特点是富含一一4个事件循环,当内部管理事件存在时使用回调机制来触发相应的除理。多任务管理器运行是另这种常用编程范式,否则 更容易理解。

  开发Nebula框架目的是致力于提供这种基于C++快速构建高性能的分布式服务。将会实在本文对你有用,别忘了到Nebula的 Github 或 码云 给个star,谢谢。

  一一4个典型的事件驱动的任务管理器运行,只是一一4个死循环,并以一一4个任务管理器运行的形式存在,这种死循环包括一一4个每项,第一一4个每项是按照一定的条件接收并选则一一4个要除理的事件,第4个每项只是事件的除理过程。任务管理器运行的执行过程只是选则事件和除理事件,而当这么任何事件触发时,任务管理器运行会因查询事件队列失败而进入睡眠请况,从而释放cpu。

  Nginx采用的是九种服务器设计范式里的第5种“预先派生子任务管理器运行运行,使用互斥锁上锁土办法保护accept”,Nebula采用的是九种服务器设计范式里的第6种“预先派生子任务管理器运行运行,由父任务管理器运行运行向子任务管理器运行运行传递套接字文件描述符”。

  已知业界推荐引擎有使用C++开发都不 使用Java开发,C++开发占大多数。在Bwar了解到的C++开发的推荐引擎中多使用rpc框架,使用thrift的一一4个,使用brpc的一一4个,使用grpc的一一4个,使用tars的一一4个。因哪几种开源rpc框架都不 专为推荐引擎所开发的框架,开发人员通常会在哪几种框架之上再架设一层框架,否则 才是业务逻辑开发。Bwar接触的一一4个推荐引擎只是基于brpc再开发了个人的框架否则 才做业务逻辑开发,其开发难度比较大,且不容易扩展。也许是开发人员对哪几种开源rpc框架理解严重不足深入,导致 业务逻辑开发复杂,对后续需求扩展不易。

  在事件驱动版本的任务管理器运行中,4个任务交错执行,但仍然在一一4个单独的任务管理器运行控制中。当除理I/O将会这种昂贵的操作时,注册一一4个回调到事件循环中,否则 当I/O操作完成时继续执行。回调描述了该如何除理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待除理事件的回调函数。这种土办法让任务管理器运行尽将会的得以执行而不时时需到额外的任务管理器运行。当无IO操作时每个任务占用cpu的时间又比较少,任务管理器运行运行就会存在空闲请况。同等并发量请况下,事件驱动占用的系统资源会更好,负载足够大时,事件驱动任务管理器运行可不还都能否将cpu利用到100%。事件驱动型任务管理器运行比多任务管理器运行任务管理器运行更容易推断出行为,将会任务管理器运行员不时需关心任务管理器运行安全问题。

  事件驱动的一一4个非常有代表性的实现Node.js和redis,都不 一一4个单任务管理器运行运行(单任务管理器运行)的服务(redis的数据落地或主从同步任务管理器运行排除,其服务只是单任务管理器运行的),事件除理都通过异步回调执行。第二节中单任务管理器运行、多任务管理器运行、事件驱动编程模型等类似于于比较中看起来事件驱动是单任务管理器运行的,Node.js这种典型的事件驱动服务也是单任务管理器运行的,导致 亲戚亲戚朋友以为事件驱动不到是单任务管理器运行的,不到充分利用多CPU多核资源。实在不然,Nginx也是一一4个典型的事件驱动服务,而Nginx是多任务管理器运行运行的。从逻辑上划分后端服务,Nginx归为接入通信层(openresty这种nginx+lua实现业务逻辑的没哟讨论范围),Node.js归为业务逻辑层。接入通信层的特点都不 IO行为几乎不大消耗CPU是天然适合事件驱动的,也比较容易实现,而业务逻辑层的特点决定了事件驱动土办法实现非常复杂,但这并导致 着业务逻辑层的多任务管理器运行事件驱动难以实现。

  在多任务管理器运行模型,每个任务分别在独立的任务管理器运行中执行。哪几种任务管理器运行由操作系统来管理,在多除理器系统可不还都里能否并行除理,将会在单除理器系统上交错执行。这使得当某个任务管理器运行阻塞在某个资源的一起去这种任务管理器运行得以继续执行。与完成类似于于功能的同步任务管理器运行相比,这种土办法更有强度,但任务管理器运行员时需写代码来保护共享资源,除理其被多个任务管理器运行一起去访问。多任务管理器运行任务管理器运行更加难以推断,将会类似于于于任务管理器运行不得不通过任务管理器运行同步机制如锁、可重入函数、任务管理器运行局部存储将会这种机制来除理任务管理器运行安全问题,将会实现不当就会导致 老出微妙且令人痛不欲生的bug。原先问题,操作系统内核在切换任务管理器运行的一起去也要切换任务管理器运行的上下文,当任务管理器运行数量很多时,时间将会被耗用在上下文切换中。什么都有在大并发量时,多任务管理器运行社会形态还是无法做到强大的伸缩性。

  Nebula只是一一4个任务管理器运行运行事件驱动服务的典型。事件驱动的每一一4个任务管理器运行运行都足够高效,多个任务管理器运行运行(多任务管理器运行)又充分利用多CPU多核资源。Nebula的任务管理器运行运行模型与Nginx类似于于,区别在于Nginx是各worker互斥锁上锁accept,而Nebula是由master任务管理器运行运行accept后将连接对应的文件描述符传送给worker任务管理器运行运行(跟Memcached类似于于)。Nebula是从满足即时通讯应用而开发的Starship框架发展而来的,与nginx的任务管理器运行运行(任务管理器运行)模型存在类似于于纯属偶然。为哪几种Nebula选则传送文件描述符而都不 各worker任务管理器运行运行抢accept?跟Nebula定位有关系,Nebula不仅时需做接入通信层、数据代理层,更要做业务逻辑层,分布式服务的各层服务都可不还都能否且应该用Nebula实现,这导致 着每一一4个worker任务管理器运行运行接近于分布式服务的一一4个节点的功能,将会是worker抢占式accept就无法做定向路由。为哪几种选则多任务管理器运行运行而都不 多任务管理器运行?先看看后任务管理器运行运行与多任务管理器运行的优缺点比较: