Erlang
沙漠蜥蜴
不断学习,不断实践,才是永恒。
展开
-
EMQX消息桥接RocketMQ(3)
-module(emqx_bridge_rocket).-include("../include/emqx_bridge_rocket.hrl").-include("../include/emqx.hrl").-export([load/1, unload/0]).-export([register_metrics/0]).-export([rocket_callback/2]).-export([on_client_connected/3, on_client_disconn.原创 2021-01-22 16:33:38 · 728 阅读 · 0 评论 -
EMQX消息桥接RocketMQ(2)
-module(emqx_bridge_rocket_sup).-behaviour(supervisor).-export([start_link/0]).-export([init/1]).start_link() -> supervisor:start_link({local, emqx_bridge_rocket_sup}, emqx_bridge_rocket_sup, []).init([]) -> {ok, {{one_for_one, 10, 100}.原创 2021-01-22 16:31:57 · 471 阅读 · 0 评论 -
EMQX消息桥接RocketMQ(1)
EMQX消息桥接RocketMQ 主要依赖库:rocketmq github地址https://github.com/tlchun/erlang-rocketmq.git-module(emqx_bridge_rocket_app).-behaviour(application).-emqx_plugin(bridge).-include("../include/emqx_bridge_rocket.hrl").-export([start/2, stop/1, prep_stop/..原创 2021-01-22 16:30:11 · 958 阅读 · 0 评论 -
EMQX消息存储MongoDB源码分析(4)
-module(emqx_backend_mongo).-include("../include/emqx_backend_mongo.hrl").-include("../include/emqx.hrl").-export([pool_name/1]).-export([register_metrics/0, load/0, unload/0]).-export([on_client_connected/3, on_subscribe_lookup/3, on_client.原创 2021-01-21 16:14:41 · 270 阅读 · 0 评论 -
EMQX消息存储MongoDB源码分析(3)
-module(emqx_backend_mongo_cli).-behaviour(ecpool_worker).-include("../include/emqx.hrl").-include("../include/mongo_protocol.hrl").-export([client_connected/2, subscribe_lookup/2, client_disconnected/2, message_fetch/3, lookup_retain/2, a.原创 2021-01-21 16:11:40 · 343 阅读 · 3 评论 -
EMQX消息存储MongoDB源码分析(2)
-module(emqx_backend_mongo_sup).-include("../include/emqx_backend_mongo.hrl").-behaviour(supervisor).-export([start_link/1]).-export([init/1]).start_link(Pools) -> supervisor:start_link({local, emqx_backend_mongo_sup}, emqx_backend_mongo_su.原创 2021-01-21 16:08:51 · 174 阅读 · 0 评论 -
EMQX消息存储MongoDB源码分析(1)
EMQX消息存储MongoDB 牵涉的外部库文件列表1、mongodb:https://github.com/comtihon/mongodb-erlang.git2、ecpool:ecpoolis different with worker-pool libraries in that it is designed to pool connection/clients to server or databasehttps://github.com/emqx/ecpool.git-mod...原创 2021-01-21 16:06:58 · 313 阅读 · 0 评论 -
EMQX消息存储Redis源码分析(5)
单机模式牵涉emqx_backend_redis_sub模块,该模块主要实现订阅redis数据。-module(emqx_backend_redis_sub).-behaviour(gen_server).-export([start_link/1]).-export([init/1,handle_call/3,handle_cast/2, handle_info/2, terminate/2, code_change/3]).-record(state, {sub}).start.原创 2021-01-21 15:50:39 · 187 阅读 · 0 评论 -
EMQX消息存储Redis源码分析(3)
emqx_backend_redis 模块是主要的工作模块,内部定义了redis统计,模块载入和卸载接口。1、emqx_metrics 模块2、emqx 模块的钩子函数3、emqx_topic模块-module(emqx_backend_redis).-include("../include/emqx_backend_redis.hrl").-include_lib("../include/emqx.hrl").%% API-export([pool_name/1,com..原创 2021-01-21 14:48:58 · 469 阅读 · 0 评论 -
EMQX消息存储Redis源码分析(2)
emqx_backend_redis_sup模块作为应用的root 监听者,主要从配置文件读取数据,然后根据数据启动单机还是集群-module(emqx_backend_redis_sup).-include("../include/emqx_backend_redis.hrl").-behaviour(supervisor).-export([start_link/1]).-export([init/1]).%% 启动应用监听者start_link(Pools) -> .原创 2021-01-21 14:22:24 · 195 阅读 · 0 评论 -
EMQX消息存储Redis源码分析(1)
EMQX 数据存储Redis主要牵涉到几个外部的库文件:1、 eredis:Non-blocking Redis client with focus on performance and robustnesshttps://github.com/wooga/eredis.git2、eredis_cluster:eredis_cluster is a wrapper for eredis to support cluster mode of redishttps://github.com/ad...原创 2021-01-21 14:13:35 · 245 阅读 · 0 评论 -
emqx 消息数据存储MySQL 插件源码分析(3)
%% 查询保留消息lookup_retain(Pool, Msg0) -> case mysql_execute(Pool,lookup_retain_query,[proplists:get_value(topic, Msg0)]) of {ok, Cols, [Row | _]} -> M = record_to_msg(lists:zip(Cols, Row)), [M#message{id = emqx_guid:f.原创 2020-12-02 23:29:45 · 219 阅读 · 0 评论 -
emqx 消息数据存储MySQL 插件源码分析(2)
1、emqx_backend_mysql_cli 模块源码分析-module(emqx_backend_mysql_cli).-include("emqx/include/emqx.hrl").%% 导出接口函数-export([client_connected/2, subscribe_lookup/2, client_disconnected/2, message_fetch/3, lookup_retain/2,原创 2020-11-29 19:25:34 · 236 阅读 · 0 评论 -
emqx 消息数据存储MySQL 插件源码分析(1)
1、emqx_backend_mysql_app模块 源码分析-module(emqx_backend_mysql_app).-include("mysql/include/emqx_backend_mysql.hrl").-behaviour(application).-emqx_plugin(backend).-export([start/2, stop/1]).start(_Type, _Args) -> %% 获取配置文件mysql的配置信息 Pools =.原创 2020-11-29 19:07:28 · 704 阅读 · 0 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_protocol模块(3)
deliver({message, #message{payload = Payload}},PState) -> send(#tcp_packet_datatrans{data = Payload,length = byte_size(Payload)}, PState); deliver({connack, Code, Msg}, PState) -> send(#tcp_packet_con.原创 2020-11-29 15:41:05 · 237 阅读 · 0 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_protocol模块(2)
clientinfo(#pstate{client_id = ClientId, username = Username, peername = {Peerhost, _},peercert = Peercert}) -> with_cert(#{zone => undefined, protocol => tcp, peerhost => Peerhost, cl.原创 2020-11-29 15:22:01 · 238 阅读 · 0 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_protocol模块(1)
-module(emqx_tcp_protocol).-export([logger_header/0]).-include("emqx_tcp/include/emqx_tcp.hrl").-include("emqx/include/emqx.hrl").-include("/emqx/include/logger.hrl").-import(proplists, [get_value/2]).-import(emqx_misc, [maybe_apply/2]).-export.原创 2020-11-29 15:21:22 · 367 阅读 · 0 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_frame模块
-module(emqx_tcp_frame).-include("/emqx_tcp/include/emqx_tcp.hrl").-export([initial_parse_state/1, parse/2, serialize/2]).-export([format/1]).%% 初始化解析状态initial_parse_state(Options) when is_map(Options) ->{none, merge_opts(Options)}.%% 合并解析配置mer.原创 2020-11-29 14:59:06 · 282 阅读 · 0 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_connection模块(4)
1、处理客户端进来的数据包,然后调用emqx_tcp_frame解析数据2、客户端socket限速方法实现3、客户端socket的active_n属性设置接口实现4、客户端socket的相关的消息统计接口实现%% 处理socket进来的空数据包process_incoming(<<>>, Packets, State) -> {keep_state, State, next_events(Packets)};process_incoming(D.原创 2020-11-29 14:24:02 · 715 阅读 · 0 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_connection模块(3)
%% 回调处理handle({call, From}, info, State) -> reply(From, info(State), State);handle({call, From}, stats, State) -> reply(From, stats(State), State); handle({call, From}, kick, State) -> ok = gen_statem:reply(From, ok), shutdown(kicke..原创 2020-11-29 14:11:53 · 401 阅读 · 2 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_connection模块(2)
接着上一篇,继续分析下面的代码%% 速率限制未定义返回rate_limit_info(undefined) -> #{};%% 调用esockd 库函里面的方法获取限速相关信息rate_limit_info(Limit) -> esockd_rate_limit:info(Limit).%% 通过进程id 获取进程的统计信息stats(CPid) when is_pid(CPid) -> call(CPid, stats);stats(#state{transport.原创 2020-11-29 13:47:10 · 291 阅读 · 1 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_connection模块(1)
2> {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(emqx_tcp_connection,[abstract_code]).io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).原创 2020-11-29 13:21:59 · 946 阅读 · 0 评论 -
emqx私有tcp协议服务器开发---emqx_tcp_sup模块
-module(emqx_tcp_sup).%% 监听者行为模式-behaviour(supervisor).%% 启动模块方法-export([start_link/0]).%% 回调初始化方法-export([init/1]).%% 监听者启动函数start_link() -> %% 调用模块emqx_tcp_sup的方法 supervisor:start_link({local, emqx_tcp_sup},emqx_tcp_sup,[]).%% 回.原创 2020-11-28 14:42:11 · 432 阅读 · 0 评论 -
emqx私有tcp协议服务器开发---emqx-tcp.hrl
-define(APP, emqx_tcp).%% 65535 Bytes 最大报文定义-define(MAX_PACKET_SIZE, 16#ffff).-define(TCP_PROTO_V1, 1).-record(tcp_packet_conn, {client_id, keepalive, username, password, version}).-record(tcp_packet_connack, {code, msg}).-record(tcp_packet_da.原创 2020-11-28 14:30:02 · 436 阅读 · 0 评论 -
emqx tcp私有协议开发---emqx_tcp_app
-module(emqx_tcp_app).-behaviour(application).## 插件协议-emqx_plugin(protocol).## 导出启动和停止方法-export([start/2, stop/1]).## 导出socket监听和停止方法-export([start_listener/1,start_listener/3,stop_listener/1,stop_listener/3]).## 引入mqtt头文件-include("emqx_mqtt.h.原创 2020-11-28 14:15:21 · 789 阅读 · 0 评论 -
EMQX源码分析---esockd_sup 模块源码分析
esockd_sup模块的行为模式是 supervisor,该模式是一个监督者,该模块被 esockd_app模块内部的 start(_StartType, _StartArgs)方法内部调用,然后在esockd_sup内部会调用下面的方法:-spec(start_link() -> {ok, pid()} | ignore | {error, term()}).start_link...原创 2019-02-27 19:48:23 · 657 阅读 · 0 评论 -
EMQX源码分析---esockd源码分析
一、基本功能介绍 1、esockd是erlang异步非阻塞TCP/SSL Socket服务器框架 2、支持Acceptor池与异步Accept 3、支持UDP/DTLS 服务器 4、支持最大连接数管理 5、支持动态对指定的ip进行否定和允许 6、客户端限速支持 7、ip6支持二、架构图三、从esockd.erl 文件开始该模块包含了核心A...原创 2019-02-27 19:32:05 · 1840 阅读 · 0 评论 -
ubuntu rebar3 安装
$ git clone https://github.com/erlang/rebar3.git cdrebar3 cd rebar3 ./bootstrap$ ./rebar3 local install将rebar3文件夹复制到系统目录库下[root@localhost ERL_LIBS_FILE]# cp rebar3-rf /usr/local/bin编辑etc/profile并添加原创 2017-08-04 18:05:03 · 2514 阅读 · 0 评论 -
高性能,高并发通信服务器研究方向
语言列表: 1.Erlang 2.Golang 3.C/C++ 4.java开源通讯库: c/c++通讯库 1.libuv 2.libevent 3.zeromqErlang消息框架: 1.rabittmq 2.emqtt 3.esockdGolang语言通讯框架: 1.NSQ 2.KiteQ 3.cellnetjava通讯库: 1.Netty 2.Mina协程库:原创 2017-03-09 21:28:45 · 788 阅读 · 0 评论 -
ActiveMQ使用笔记-1
JMS(Java Message Service)即Java消息服务。它提供标准的产生、发送、接收消息的接口简化应用的开发。它支持两种消息通信模型:1.点到点(point-to-point)模型:P2P模型规定了一个消息只能有一个接收者,消息生产者产生一个消息后,把这个消息发送到一个QUEUE队列中,然后消息接收者在从这个队列中读取这个消息,一旦这个消息被一个接收者读取之后,它就在这个QUEU原创 2016-12-30 22:00:47 · 421 阅读 · 0 评论 -
EMQX源码分析--- esockd_rate_limiter 模块源码分析
esockd_rate_limiter模块是一个工作者进程,主要是实现基于ets esockd_rate_limiter表来限制socket的速率,其代码如下:-module(esockd_rate_limiter).-behaviour(gen_server).-export([start_link/0]).-export([create/2, create/3, consum...原创 2019-02-27 20:17:34 · 478 阅读 · 0 评论 -
erlang est 并发
1、ETS是Erlang内置的内存数据库,具有并发读写的性能。2、ETS驻留在内存,DETS驻留在硬盘。3、ETS存储是临时的,DETS中的数据存储是持久的。4、ETS非常高效,在ETS中,无论你存储多少数据,查询速度都与之无关(特定情况成对数关系),前提是拥有足够大的内存。5、DETS相对效率要低很多,但比ETS更加节省内存。6、ETS表和DETS表可以被多个进程共享,可以...原创 2019-02-23 13:50:27 · 377 阅读 · 0 评论 -
EMQX源码分析---esockd_server模块源码分析
-module(esockd_server).-behaviour(gen_server).-export([start_link/0]).%% stats API 导出模块接口给外部调用-export([stats_fun/2, init_stats/2, get_stats/1, inc_stats/3, dec_stats/3, del_stats/1]).%% gen_...原创 2019-02-28 10:31:39 · 330 阅读 · 0 评论 -
erlang est表
ETS是Erlang Term Storage 的缩写,它是一个基于内存的KV( Key Value) Table,支持大数据量存储以及高效查询。ETS表的基本:1、ETS 表可以用来高效存储海量的erlang数据,ETS提供大型的键-值查询表.2、ETS是相当高效的:可以用它存储海量的数据(只要有足够的内存),最常用的表操作是插入和查找.3、ETS表的数据保存在内存里,他们是易失的。当...原创 2019-02-13 15:27:41 · 493 阅读 · 0 评论 -
EMQX源码分析---esockd_listener_sup模块源码分析
在前面的文章提到执行ok = esockd:start()后,应用分别启动三个模块esockd_sup,esockd_rate_limiter,esockd_server,这三个模块启动后,我们需要注入我们自己实现的socket服务,这里以echo_server为例,当在shell里执行esockd:open(echo, 5000, Options, MFArgs).的时候会调用esoc...原创 2019-02-28 15:38:59 · 491 阅读 · 0 评论 -
EMQX源码分析---esockd_connection_sup源码分析
该模块主要是监听连接的socket连接,所以这个模块主要包含一些针对连接的管理接口,该模块主要的API如下:1、start_link(Opts, MFA) 该函数主要是启动esockd_connection_sup监听器,函数内部调用了OTP的gen_server:start_link(?MODULE, [Opts, MFA], [])函数,然后回调该模块的init([Opts, MFA]...原创 2019-03-02 14:49:27 · 1515 阅读 · 0 评论 -
EMQX源码分析---esockd_acceptor_sup源码分析
该模块主要是启动一个监督者模块esockd_acceptor_sup,该模块主要是对esockd_acceptor模块的工作进程进程监督。该模块对外提供了三个函数,分别如下:1、start_link(ConnSup, TuneFun, UpgradeFuns, StatsFun, LimitFun):该函数被esockd_listener_sup模块的start_link函数内部调用,所以es...原创 2019-03-02 15:25:09 · 513 阅读 · 0 评论 -
Socket TCP/IP协议数据传输过程中的粘包和分包问题
1.通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解: 下面对上面的图进行解释: 1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。 2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲bu原创 2016-12-14 15:39:35 · 16138 阅读 · 1 评论