erlang

erlang进程与操作系统线程

橙三吉。 提交于 2020-03-29 05:24:51
erlang多进程与多线程: 在erlang开发中,我们面对的最小执行单位是进程,当然这个进程并不是系统层面上的进程,也不是线程。而是基于erlang运行时系统的一个进程。那么erlang的多进程是如何变成系统级别上的多线程,进而被多核处理器处理呢? 其实,我们每启动一个erlang VM,实际上就启动了模拟器+erlang运行时系统。而每个erlang运行时系统会启动N个进程调度器,每个进程调度器都是一个独立的操作系统线程。这个调度器会处理一个进程池,进程池里面是M个erlang进程。也就是说erlang进程以1:M的方式映射到操作系统线程。 既然每个调度器都是一个操作系统线程,那么可并行运行的erlang进程最多就能有M个。虽然一个进程池内有M个进程,但是同一池内的进程仍像之前所有进程公用一个调度器那样分时运行。 并且在此之上,进程可以在进程池之间迁移以便维持可用调度器上的负载均衡。 erlang程序的单进程与多线程: 每启动一个erlang VM,也就启动了一个进程,该进程包括很多线程,最基本就包括了erlang运行时系统和模拟器所创建的线程。如果在该虚拟机上还运行erlang程序,那么ERTS就有可能为你的应用程序创建了N个线程。这些线程的个数,跟启动erlang VM时设置的参数和自身硬件环境有关

RabbitMQ集群架构之使用Haproxy实现高可用负载均衡

蓝咒 提交于 2020-03-28 15:54:20
RabbitMQ集群架构模式 那么对于Rabbitmq是单点应用来说,如果rabbitmq整个消息mq都会摊掉,所有在mq的消息高可用部分,就显得尤为重要了,那么在mq中提供了四种集群架构方案: 1、主备模式 (Warren) 2、镜像模式 (Mirror) 3、远程模式 (Shovel) 4、多活模式 (Federation) 在我们开发中最直接的模式就是主备模式:主要实现RabbitMQ的高可用集群,一般在并发和数据量不高的情况下,这种模型非常的好用且简单,主备模式也称为Warren模式 也就是一主一备,对于集群来说至少有两台服务器,那么这两台服务器一台在工作,一台在闲置,注意,这个的主备和我们之前的主从是不一样的,主从的话是一台作为主服务器,一台作为从服务器,虽然这两台是数据同步,主负责读写,而从只负责只读,而主备是一台工作一台闲着,如果一台服务器宕机了,那么备服务器切换过来,可能的话,这种对于负载均衡的话一台只忙着干活,一台只闲着,这种的生产中用的也很少,这种会造成我们资源的一个浪费。 镜像模式:集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失,在实际工作中也是用的最多的,而且实现集群也非常简单,一般互联网大厂都会构建这种镜像集群模式,原理主要是在主备的基础上进行了扩展,集群中所有的节点设备都是同步的,每一个队列,交换机里面的配置信息和我们的数据都是同步的

erlang一次线上问题解决

淺唱寂寞╮ 提交于 2020-03-28 07:32:51
1.异常的原因: (1).DocumentDB重启导致一段时间服务不可以使用,并且DocumentDB无法实现主备的切换; (2).statistic_record_service, thirdparty_control,queue_message这三个gen_server由于在访问DocumentDB的时候没有做异常的处理,导致监控xxxxxx_sup多次重启这些服务,一定频率之后({one_for_one, 10, 10})xxxxxx_sup会停掉所有监控的服务,最终导致整个iot云端的服务不可使用。 备注:xxxxxx_sup监控下的服务如果在最近的 MaxT 秒内发生的重启次数超过了 MaxR 次,那么督程会终止所有的子进程,然后结束自己。 参考文档: https://erldoc.com/doc/otp-design-principles/supervisor.html (3)关键信息: reached_max_restart_intensity 2019-08-02 07:01:27.600 [error] <0 . 360 . 0> Supervisor xxxxxx_sup had child queue_message started with octopus_queue_message :start_link([]) at <0 . 16789 . 4084>

Erlang gen_server:start_link/3 和gen_server:start_link/4

你说的曾经没有我的故事 提交于 2020-03-28 06:52:53
两个方法都可以用来启动一个gen_server服务器进程,具体的参数如下: gen_server:start_link(Module,Args,Option); gen_server:start_link(ServerName,Module,Args,Option); 第二个方法只比第一个多了个ServerName,在gen_server的源码中区别如下: start_link(Mod, Args, Options) -> gen:start(?MODULE, link, Mod, Args, Options). start_link(Name, Mod, Args, Options) -> gen:start(?MODULE, link, Name, Mod, Args, Options). 再具体看gen的源码: -spec start(module(), linkage(), emgr_name(), module(), term(), options()) -> start_ret(). start(GenMod, LinkP, Name, Mod, Args, Options) -> case where(Name) of undefined -> do_spawn(GenMod, LinkP, Name, Mod, Args, Options); Pid ->

[Erlang09]Erlang gen_server实现定时器(interval)的几种方法及各自的优缺点?

本秂侑毒 提交于 2020-03-28 06:50:51
方法1: %%gen_server:部分call_back function. -define(TIME,1000). init([]) –> erlang:send_after(?TIME,self(),loop_interval_event), {ok, #state{}}. handle_info(loop_interval_event, State) –> NewState = do_loop_interval_event(State), erlang:send_after(?TIME,self(),loop_interval_event), {noreply, NewState}. 优点:可以加任意多个定时器,且可以保证do_loop_interval_event/1处理完后才触发第二个定时器【想像一个如果处理event 200ms,处理间隔是150ms,那么这个进程还是可以不阻塞消息队列的】.这种方法也是推荐使用的。 缺点: 如果项目有很多的进程都有定时器,大家都调用系统函数来判定时间,性能消耗会增大【这个=下讲原因】。 方法2: %%在gen_server:call back function 返回值加入一个时间 init([]) –> {ok, #state{},?TIME}. handle_info(timeout,State = #state{count =

怎么学习区块链技术?

大憨熊 提交于 2020-03-26 17:06:59
3 月,跳不动了?>>> 随着科技的发展,越来越多的专业名词进入人们的生活,本来区块链是一个十分专业性的名词,常常是专业人士才会谈论区块链,但是在现在互联网和大数据的时代,区块链和我们每一个人都是相关的,俺们区块链技术入门应该学习什么呢? 区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。区块链是比特币的底层技术,像一个数据库账本,记载所有的交易记录。这项技术也因其安全、便捷的特性逐渐得到了银行与金融业的关注。 看下面的例子: 比特币是用C ++语言实现的 以太坊有三种不同的编程语言的参考实现:Go语言实现的Geth客户端,C ++语言实现的Eth客户端以及Python语言实现的PyEthApp。 区块链应用平台Lisk采用JavaScript构建。利用JavaScript强大的API,该平台将允许在纯JavaScript中构建不同的区块链应用程序。 在其他语言中还有更多的区块链实现,如Rust,Ruby和ERLANG。 通过简单了解什么是分布式账本和什么是对等网络这些基本原则,您无法熟练掌握区块链技术。你需要能够实现这些原则。唯一的方法是学习相关的编程语言。要了解区块链技术,请按照以下步骤操作。 找出最相关的实现语言 区块链技术的应用范围很广,从智能合约到记录管理

Windows安装RabbitMQ

两盒软妹~` 提交于 2020-03-24 16:57:32
3 月,跳不动了?>>> 1、安装erlang 1.1、下载erlang安装包 下载地址: http://www.erlang.org/downloads 1.2、安装erlang 双击运行“otp_win64_22.3.exe”安装包,一路next直到完成。 1.3 、配置erlang 打开系统高级设置,高级系统设置-->环境变量-->“新建”系统环境变量 变量名:ERLANG_HOME=刚安装的路径 将%ERLANG_HOME%\bin加入到path中。 1.4、测试erlang windows键+R键,输入cmd,再输入erl,看到版本号就说明erlang安装成功了。 2、安装RabbitMQ 2.1、安装RabbitMQ 双击运行:rabbitmq-server-3.8.3.exe,按照安装向导,安装完成 2.2、安装RabbitMQ插件 RabbitMQ安装好后接下来安装RabbitMQ-Plugins。打开命令行cd,输入RabbitMQ的sbin目录。 然后在后面输入rabbitmq-plugins enable rabbitmq_management命令进行安装 2.3、启动 打开sbin目录,双击rabbitmq-server.bat 访问 http://localhost:15672 , 默认用户名和密码:guest/guest 来源: oschina 链接:

初始 redis

半腔热情 提交于 2020-03-24 08:36:51
3 月,跳不动了?>>> 官方定义: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言 编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库 ,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。 详细说明: redis是一个key-value 存储系统 。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list( 链表 )、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些 数据类型 都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了 memcached 这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用

[Erlang 0027] Using Record in Erlang Shell

二次信任 提交于 2020-03-24 01:51:21
[Erlang 0006] Erlang中的record与宏 中我们提到过Record是一个编译时的功能,在Erlang VM中并没有专门的数据类型.在线上解决问题有时候会遇到要在shell中使用record,那么就有两个选择:1.在shell中构造record定义,如果能构造record有了record的定义编写ets:match的匹配模式就方便多了; 2.直接使用record对应的tuple结构; 方法一 使用rd命令 Eshell V5.9 (abort with ^G)1> rd(film ,{ director, actor, type, name,imdb}).film2> F =#film{}.#film{director = undefined,actor = undefined,type = undefined,name = undefined,imdb = undefined}3> F#film.type.undefined4> F#film.type=23.* 1: illegal pattern5> F2 =F#film{type=23}.#film{director = undefined,actor = undefined,type = 23,name = undefined,imdb = undefined} 方法二使用rr命令

erlang里的标点符号

[亡魂溺海] 提交于 2020-03-23 11:07:59
逗号( ,)分隔函数调用、数据构造和模式中的参数。 分号( ;)分隔子句。我们能在很多地方看到子句,例如函数定义,以及case、 if、try..catch和receive表达式。 句号( .)(后接空白)分隔函数整体,以及shell里的表达式。 来源: 51CTO 作者: xtceetg 链接: https://blog.51cto.com/xtceetg/2480957