事件驱动

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

末鹿安然 提交于 2019-12-23 22:42:07
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>   事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。多线程是另一种常用编程范式,并且更容易理解。   高性能通用型C++网络框架 Nebula 是基于事件驱动的多进程网络框架(适用于即时通讯、数据采集、实时计算、消息推送等应用场景),已有即时通讯、埋点数据采集及实时分析的生产应用案例。经常有人问Nebula的每个进程里是单线程还是多线程的?又问为什么不用多线程?不用多线程又怎么处理并发问题?   最近 Nebula 将会用于一个新的生产项目——推荐引擎,在此之前团队已有使用某知名度较高的RPC框架多线程版推荐引擎(业界许多推荐引擎都用了目前比较知名的开源RPC框架来开发)。本文不做Nebula与各知名RPC框架的比较,也无意说明哪个框架更适合做推荐引擎,只说明Nebula可以用于推荐引擎,且有信心效果会很好。最终结果如何,等推荐引擎研发出来,拭目以待。   为什么是事件驱动而不是多线程?事件驱动无须多线程。我们先来回顾一下服务器编程范式。 1. 服务器程序设计范式   《UNIX网络编程》卷一里介绍了9种服务器设计范式:   九种服务器设计范式并不是全都有实用价值,在《UNIX网络编程

事件驱动模式--Reactor

♀尐吖头ヾ 提交于 2019-12-18 18:48:28
原文:https://www.cnblogs.com/harvyxu/p/7498763.html 1 Reactor模型   Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(文件描述符或socket可读、写),多路复用器返回并将事先注册的相应I/O事件分发到对应的处理器中。   Reactor是一种事件驱动机制,和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。用“好莱坞原则”来形容Reactor再合适不过了:不要打电话给我们,我们会打电话通知你。 Reactor模式与Observer模式在某些方面极为相似:当一个主体发生改变时,所有依属体都得到通知。不过,观察者模式与单个事件源关联,而反应器模式则与多个事件源关联 。 Reactor模型各模块之间的关系如下图所示 : Handle( 描述符 ): 即操作系统中的句柄fd,是对资源在操作系统层面上的一种抽象,它可以是打开的文件、一个连接(Socket)

nginx架构分析

烈酒焚心 提交于 2019-12-18 01:39:06
Nginx模块化 #Nginx基于模块化设计,每个模块是一个功能实现,分布式开发,团队协作 #核心模块、标准HTTP模块、可选HTTP模块、邮件模块、第三方模块 #编译后的源码目录objs/ngx_modules.c # https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/module.md Nginx的web请求机制 #并行处理:多进程、多线程、异步 # https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/IO.md Nginx事件驱动模型 # https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/event.md 设计架构概览 #Nginx基于模块化设计、基于事件驱动模型处理请求、主进程和工作进程 # https://coding.net/u/aminglinux/p/nginx/git/blob/master/4z/jg.md Nginx模块化结构 Nginx涉及到的模块分为核心模块、标准HTTP模块、可选HTTP模块、邮件服务模块以及第三方模块等五大类。 核心模块 核心模块是指Nginx服务器正常运行时必不可少的模块,它们提供了Nginx最基本最核心的服务,如进程管理、权限控制

NodeJS学习笔记

半城伤御伤魂 提交于 2019-12-17 11:11:26
一.概述 Node.js 是一种建立在Google Chrome’s v8 engine上的 non-blocking (非阻塞), event-driven (基于事件的) I/O平台. 以事件驱动为核心,单线程,单进程。Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计。对于高并发的解决方案,传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式 I/O 调用时的时间开销。Node.js 使用的是单线程模型,对于所有 I/O 都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。事件驱动机制是Node.js通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文切换,这意味着面对大规模的http请求,Node.js凭借事件驱动搞定一切。因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求。可以通过运行多个Node.js进程的方式来有效利用多个CPU。 二.Node.js选择的异步I/O方案 1.在Linux下,node.js靠libev和libeio配合使用来实现异步I/O。 (1).什么是libev? • libev是一个事件驱动库

libev 笔记(一):“事件驱动模型” 的 理解

醉酒当歌 提交于 2019-12-10 22:52:35
libev 是 一种 “事件驱动”的编程框架,所谓“事件驱动”,简单地说就是就是 有什么动作(点按钮、中断),程序就执行什么操作(中断服务函数、回调函数),当然事件不仅限于用于的操作,只要是定义好的,各种突发、预设的各种将要发生的事情,都是事件。这里,我对CPU相对熟悉一些,可以把“事件驱动”理解为 自定义软件中断。这里我们举几个案例来分析: 案例1: 状态机FSM 状态机是一种常用的编程框架,本质上讲,状态机也是一种事件驱动,“状态”就相当于“事件”,不同状态执行不同的代码功能,这里的代码功能就相当于 事件对应的 驱动 功能。 案例2:硬件中断 硬件中断是 最典型的 事件驱动,只不过这里的中断是CPU厂家预设的,当发生某一硬件中断时,执行对应的 中断服务函数,这里的 “中断”就是 “事件”,而 中断服务函数 就是 驱动。 案例3:功能 回调函数 我们在使用 一些 SDK 的时候,很多的SDK 都会提供 接口 和回调函数,这种回调 函数 也是事件驱动模型,只不过这些 事件 是SDK 定义好的,回调函数 是允许用户 自定义的 事件驱动 函数。 libev 提供了基本的 IO 事件、定时器事件、信号事件,这三种事件用的比较多,这里的IO就是针对 文件描述符,在Linux下,一切设备都是 文件,所以 IO 事件可以针对 所有的外设备,比如网口、socket,串口,文件等。定时器

转:微服务下事件驱动

被刻印的时光 ゝ 提交于 2019-12-06 19:32:34
from:https://blog.csdn.net/alex_xfboy/article/details/77335982 领域驱动设计(DDD)是一种奇妙的技术,试图使我们的设计更接近于业务领域 。我们采用了领域驱动的开发方式,使用了充血模型,享受了他的好处,但是也不得不面对他带来的弊端。这个弊端在分布式的微服务架构下面又被放大。 事务一致性 事务一致性的问题在Monolithic下面不是大问题,在微服务下面却是很致命,我们回顾一下所谓的ACID原则 Atomicity - 原子性,改变数据状态要么是一起完成,要么一起失败 Consistency - 一致性,数据的状态是完整一致的 Isolation - 隔离线,即使有并发事务,互相之间也不影响 Durability - 持久性, 一旦事务提交,不可撤销 在单体服务和关系型数据库的时候,我们很容易通过数据库的特性去完成ACID。但是一旦你按照DDD拆分聚合根-微服务架构,他们的数据库就已经分离开了,你就要独立面对分布式事务,要在自己的代码里面满足ACID。 对于分布式事务,大家一般会想到以前的JTA标准,2PC两段式提交。我记得当年在Dubbo群里面,基本每周都会有人询问Dubbo啥时候支撑分布式事务。实际上根据分布式系统中CAP原则,当P(分区容忍)发生的时候,强行追求C(一致性),会导致(A)可用性、吞吐量下降

Nodejs异步非阻塞式IO/事件驱动IO原理

不想你离开。 提交于 2019-12-05 15:42:26
关于 node.js Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数 事件驱动程序 Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。 当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。 这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO) 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。 整个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。 Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件: // 引入 events 模块

#分布式系统架构之# 事件驱动模式以及与之匹配的长时间处理过程讨论

[亡魂溺海] 提交于 2019-12-05 07:33:39
在分布式系统下,可以很多种架构从事设计,或者分布式系统对技术架构本身没有做严格的限制。但是结合自己的实践以及基于《领域驱动设计》的推荐, 采用 【事件驱动模式】是比较好的一种分布式系统架构方式。该模式充分实现了 不同系统之间的代码解耦,所有的业务流转是通过事件广播进行驱动的。所有业务都是在针对 名为【事件总线】的组件在编程,也无需知道事件的生产者,每个业务只监听自己感兴趣的事件,然后根据事件触发不同的业务代码 以及 自己在处理完某种业务后,也对外广播发出事件,则标志着当前业务的完成。 基于【事件驱动模式】是一种比较接近人类自然行为的一种模式,该模式给系统的解耦以及重构带来了先天优势。相对比与传统的业务模式,大量的业务流程都是基于代码或者是某种规则引擎加以实现,而 事件驱动模式 则是针对事件总线注册监听, 【事件总线】总是能够忠实的把消息投递给感兴趣的监听者,并且保证其对应业务逻辑的自然触发。一旦有业务变动,我们仅仅是在【事件总线】上增加 或者 移除对应的事件消费者,或者注册新的事件发布者,这种行为并没有影响到当前的业务代码变动。 用日常通俗讲法:更加接近于 小学老师讲课,老师常常会不自觉的吼一声:“小朋友们,记住了吗?”这时,这要是听到该咨询的小朋友 都会回应道:“听懂了”,在此过程中 ,声音作为事件、空气作为事件总线(忠实的传递事件到达监听者),如果这个时候

Node.js

人盡茶涼 提交于 2019-12-05 02:42:42
Node.js是一个JS的运行环境. 基于google的V8引擎. 可以用来编写Web服务器一样的网络应用, 使JS可以通过node.js与后端互动. Node.js是非堵塞的,多条命令可同时执行. 是事件驱动的,可以不使用线程创建一个能够承载高并发的服务器. 前端可通过node.js来编写与后端互动的相关语句. 来源: https://www.cnblogs.com/jrri/p/11898959.html

Android WIFI 详解

荒凉一梦 提交于 2019-12-05 01:18:54
最 近研究Wifi模块,查了不少的相关资料,但发现基本上是基于android2.0版本的的分析,而现在研发的android移动平台基本上都是2.3的 版本,跟2.0版本的差别,在Wifi模块上也是显而易见的。2.3版本Wifi模块没有了WifiLayer,之前的WifiLayer主要负责一些复 杂的Wifi功能,如AP选择等以提供给用户自定义,而新的版本里面的这块内容基本上被WifiSettings所代替。 本文就是基于android2.3版本的Wifi分析,主要分为两部分来分别说明: (1) Wifi模块相关文件的解析 (2) Wpa_supplicant解析 (3) Wifi的启动流程(有代码供参考分析) 一,Wifi模块相关文件解析 1) wifisettings.java packages/apps/Settings/src/com/android/settings/wifiwifisettings.java 该类数据部分主要定义了下面几个类的变量: { private final IntentFilter mFilter; //广播接收器,用来接收消息并做响应的处理工作 privatefinal BroadcastReceiver mReceiver; //这是一个扫描类,会在用户手动扫描 AP时被调用 privatefinal Scanner mScanner;