erlang

RabbitMQ学习笔记

筅森魡賤 提交于 2020-03-09 18:44:30
1. 消息中间件的核心设计思想 : 采用 异步 通讯、自动 补偿与重试 、 分布式事务 、解决 流量削峰 问题、系统的 解耦 2. 消息中间件常用名词 : Broker 消息转发端,消息中间件Server端; Message 发送的消息内容 roducer 生产者,向Server端投递消息; Consumer 消费者,向Server端获取消息 MessageId 消息全局id 解决消息幂等性问题 3. 主流的MQ对比分析 ActiveMQ: 基本淘汰(老项目使用) 够轻巧(源代码比RocketMQ多),支持持久化到数据库, 对队列数较多的情况支持不好。 RabbitMQ: 结合erlang语言本身的并发优势,支持很多的协议:AMQP,XMPP, SMTP, STOMP, 也正是如此,使的它变的非常重量级,更适合于企业级的开发。 RocketMQ: 阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ, 是阿里参照kafka设计思想使用java实现的一套mq,同时将阿里系内部多款mq产品 (Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖, 保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构, 目前主要多用于订单交易系统。 Kafka: Apache下的一个子项目

Erlang OTP行为模式behaviour——gen_event

匆匆过客 提交于 2020-03-09 18:26:49
说明 最近笔者在学习otp行为模式,在查阅相关资料时发现网上有关erlang的资料不是很多,也不够详细。在参考官方文档以及其他作者的文章后,决定写这篇博客。算是自己对知识的复习,也为诸君提供一些参考。 1.gen_event 简介 Gen_event实现了通用事件处理,通过其提供的标准接口方法以及回调函数,在OTP里面的事件处理模块是由一块通用的事件管理器和任意数量的事件处理器,并且这些事件处理器可以动态的添加和删除。一个事件可以用来记录error,alarm,info, warning等信息。一个事件管理器可以安装一个或多个事件处理器,当一个事件管理器接受到一个事件的通知时,这个事件将会被所有的已安装的事件处理器依次处理。 事件管理器是作为一个进程实现的,每个事件处理器都是一个回调模块。且事件管理器实质上是一个{Module,State} 组成的列表,Module是事件处理器,State为该事件处理器内部状态。 2.事件处理器 不多废话,直接上代码,以下为一个事件处理器标准模板,具体函数将在后面做出详细解释。事件处理器可以有多个。 -module(info_logger). -behaviour(gen_event). %% gen_event callbacks -export([init/1, handle_event/2, handle_call/2, handle

服务器结构总结

∥☆過路亽.° 提交于 2020-03-09 11:16:13
数据库设计 erlang + mysql5.6 设计 网络设计 erlang +cowboy + ranch + http/https设计 逻辑设计 erlang + 代码结构 + 断线重连 日志设计 日志保存 + 数据库日志保存 协议设计 erlang + protobuf/自定义协议格式 配置导表设计 excle + php 导报 协议生成设计 php 导出协议/protobuf 导出协议+ 序列化/反序列化 代码编译 编译成beam文件 服务器运维设计 linux + shell 脚本 + 热更新 + 代码同步 充值付费设计 sdb对接 + php服务器验证+ 服务器验证+ 发货 + 充值记录 分布式跨服机制 erlang + 分布式跨服机制 机器人机制/压测 tsung + robo机制验证 合服机制 数据库的简单合并(注意key值得合并即可,以及有些数据值得删除操作) 脚本的数据库合并(用脚本的方式避免各个key值得重复,需要每个功能都写合服脚本) 来源: oschina 链接: https://my.oschina.net/gaoxepro/blog/3190364

centos8安装RabbitMQ

左心房为你撑大大i 提交于 2020-03-09 03:51:22
一、安装erlang # 添加仓库 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash Detected operating system as centos/8. # 安装erlang dnf install erlang 二、导入密钥 rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc 三、在/etc/yum.repos.d目录下添加rabbitmq.repo文件,内容如下: [bintray-rabbitmq-server] name=bintray-rabbitmq-rpm baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.8.x/el/8/ gpgcheck=0 repo_gpgcheck=0 enabled=1 四、下载rabbitmq wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.1

erlang gen_event解析

主宰稳场 提交于 2020-03-07 19:09:05
版本详情 otp_src_22.2 基本概述 gen_event 是一个时间触发器的操作,支持异步消息处理和同步消息处理。通过调用gen_event:notify(M, Event) -> send(M, {notify, Event}) 发送数据信息,给已经注册到M模块的时间句柄发送信息。 基本功能模块 system信息 处理系统信息system,通过sys模块的方法调用 处理了基本的五个模块:system_code_change(模块变更的处理),system_continue(系统suspend之后的重新启动),system_get_state(获取进程的state数据),system_replace_state(系统替换state数据),system_terminate(系统关闭处理) 启动 gen_event 模块 模块调用gen_event:start/start_link的方法启动进程 gen_event不支持模块回调,所有的消息处理都是在gen_event模块处理 所有的gen_event模块不需要继承gen_evnet的行为 启动事件句柄 此事件句柄必须满足gen_event的call_init接口,所以,此事件必须拥有gen_event的行为 gen_event的行为包括:init/1,handle_info/2,terminate/2,code_change

erlang 代码加载和热替换实验

ぃ、小莉子 提交于 2020-03-07 12:37:14
主要涉及到的模块是code模块 code:purge--------------------------------------------------------------------------------------------------------------- 清理内存中的代码 purge(Module) -> boolean() ,不论是否旧代码被使用都清理,杀死使用旧代码的进程 Types: Module = module() Purges the code for Module , that is, removes code marked as old. If some processes still linger in the old code, these processes are killed before the code is removed. Returns true if successful and any process needed to be killed, otherwise false . 如果旧的代码还被使用就不能清理,返回false,否则清理,返回true soft_purge(Module) -> boolean() Types: Module = module() Purges the code for Module ,

RabbitMQ介绍及安装部署

半城伤御伤魂 提交于 2020-03-07 07:46:08
本节内容: RabbitMQ介绍 RabbitMQ运行原理 RabbitMQ重要术语 三种ExchangeType RabbitMQ集群种类 集群基本概念 镜像模式部署集群 一、RabbitMQ介绍 消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶。 或许你正在考虑进行数据投递,非阻塞操作或推送通知。或许你想要实现发布/订阅,异步处理,或者工作队列。所有这些都属于消息系统的模式。 RabbitMQ是一个消息代理,一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息再传输过程中的安全。 RabbitMQ是一个在AMQP协议标准上完整的、可复用的企业消息系统。它遵循Mozilla Public License开源协议,采用Erlang语言实现的工业级的消息队列。 二、RabbitMQ运行原理 RabbitMQ的两大核心组件是Exchange和Queue,以下是它的运行原理图: 三、RabbitMQ重要术语 Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程。 Vitual Host: 这是一个虚拟概念,类似于权限控制组,一个Vitual Host里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是Vitual Host。 Exchange: 接收生产者发送的消息

初识emqx消息服务器

本秂侑毒 提交于 2020-03-07 02:07:07
EMQ X R3.0 (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源 MQTT 消息服务器。 MQTT是什么 MQTT是一个由IBM主导开发的物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。它的核心设计思想是开源、可靠、轻巧、简单,具有以下主要的几项特性: 非常小的通信开销(最小的消息大小为 2 字节); 支持各种流行编程语言(包括C,Java,Ruby,Python 等等)且易于使用的客户端; 支持发布 / 预定模型,简化应用程序的开发; 提供三种不同消息传递等级,让消息能按需到达目的地,适应在不稳定工作的网络传输需求。 emqx提供了三种消息发布服务质量 Quality of Service等级是发送与接收端的一种关于保证交付信息的协议。一共有3 个QoS 等级: (1) "至多一次0",消息发布完全依赖底层TCP/IP 网络,会发生消息丢失或者重复,这一级别可用于如下情况,环境,传感器数据,丢失一次度记录无所谓,因为不久之后会有第二次发送 (2)"至少一次1" 确保消息到达,但消息重复可能发生 (3) “只有一次2",确保消息到达一次,这一级别可用于如下情况,在计费系统中

详解RabbitMQ安装过程

不羁的心 提交于 2020-03-06 11:01:31
场景 消息队列已成为分布式系统必要组件,在很多场景下均有广泛应用,通过消息队列可将微服务解耦,拓展了架构思路和可行方案。 常用的消息队列很多,SpringCloud默认支持的有RabbitMQ及Kafka,今天介绍下RabbitMQ的安装过程。 安装Erlang RabbitMQ是使用Erlang开发的,所以需要先安装Erlang,打开网页: https://www.erlang.org/downloads ,选择windows版本下载即可。 安装过程乏善可陈,一直下一步就可以了,此处不再截图。当然兄弟你要想改下安装位置还是可以的哈哈。 安装完毕后配置下环境变量 ERLANG_HOME配置为安装目录:`D:\develop\erl10.6 PATH追加 ;%ERLANG_HOME%\bin 最后,命令行输入erl验证是否安装成功,如下图表示成功: 安装RabbitMQ 打开网页 http://www.rabbitmq.com/download.html ,选择windows版本下载 下载后直接下一步下一步安装即可。 启动 从命令行选择 RabbitMQ Command Promt ,启动命令行管理工具。 输入命令 rabbitmq-plugins enable rabbitmq_management 即可启动RabbitMQ如下图: 使用 在浏览器地址栏输入 http://127

[Erlang 0006] Erlang中的record与宏

时光怂恿深爱的人放手 提交于 2020-03-06 05:47:21
在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据项顺序调整或者增减字段,都容易出现badmatch. 同时一些常量如果硬编码到代码中,一旦数值变化,要想全部可靠的替换成新的数值是一个困难的事情. 这两种数据层面的变化,在Erlang中对应的解决方案是: record Macro record 在代码中我们创建一个record: -record(man , { name , age=0, school}). 2012-6-13 16:11:04更新 注意下面的代码都是从erl文件中截取的 代码片段 ,如果要在Erlang Shell中使用record,参见: [Erlang 0027] Using Record in Erlang Shell 我们通过下面的代码看看对应字段的默认值: %See default value M=#man{}, io:format("M is : ~p ~n", [ M ]), 可以看到输出M的值是:{man,undefined,0,undefined},其实从这里我们就可以看到record在Erlang的内部实现是还是一个tuple. 从纯数据的角度我们发现{man,undefined,0,undefined}==M ,但record本身作为一种数据抽象机制,我们不要直接record的tuple值形式. 我们给特定的字段赋值