![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Erlang
利白
这个作者很懒,什么都没留下…
展开
-
我的mqtt协议和emqttd开源项目个人理解(26) - 产品开发遇到的问题解答,关于订阅和上下线插件
我 17:27请问大咖们,之前群里提到“EMQ中CPU是公平分配给MQTT会话,大量pub消息到一个订阅,订阅不会拿到更多cpu,最终导致消息累积。”这个问题在emq v1和v2版本都存在吗?大概每秒发多少条数据就会出现这个现象?大梁先生 17:53这和机器配置有一定关系的 而且不要做这种设计呀 干嘛都投给一个topic我 17:59那应该怎么设计?因为我们的场景就是单一的行业...原创 2018-11-02 16:51:46 · 1346 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(15) - MQTT消息推送协议应用数据包超时是否需要重发?
https://blog.csdn.net/libaineu2004/article/details/80493902 今天在看MQTT协议文档,到处关于QoS(Quality of Service)的介绍,文档说如果没有收到对方的PUBREL等确认包,超时后server需要'delivery retry", 一开始觉得理所当然的,重发嘛,丢包,正常。然后就看到消息重发(Mess...原创 2018-05-30 11:13:51 · 1179 阅读 · 0 评论 -
erlang实现字符串某个字符替换
replvar(S, _Var, undefined) -> S;replvar(S, Var, Val) -> re:replace(S, Var, Val, [global, {return, list}]).start(Type) -> Topic = replvar(Type, "_", "-"), io:format("topic is a: ~...原创 2018-05-24 09:06:24 · 2347 阅读 · 0 评论 -
erlang mnesia 数据库实现SQL查询
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。下面的内容将着重说明 Mnesia 数据库如何实现SQL查询,实现select / insert / update / where / order by / join / limit / delete等SQL操作。示...转载 2018-05-22 15:46:51 · 650 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(13) - Hook使用和连接Kafka发送消息,使用brod库
一、工作环境准备erlang kafka客户端库使用的是brod,https://github.com/klarna/brodemq使用的是v2.3.5版本,https://github.com/emqtt/emq-relxkafka的运行环境准备,http://blog.csdn.net/libaineu2004/article/details/79202408我们以插件的形式来实现,我的插件路...原创 2018-03-13 16:30:37 · 3193 阅读 · 15 评论 -
我的mqtt协议和emqttd开源项目个人理解(14) - 使用redis插件来实现访问控制
一、工作环境准备准备好redis server,http://blog.csdn.net/libaineu2004/article/details/76267836erlang redis客户端使用开源项目,https://github.com/wooga/erediserlang连接池,https://github.com/emqtt/ecpoolemq使用的是v2.3.5版本,https://...原创 2018-03-16 09:40:28 · 2359 阅读 · 2 评论 -
我的mqtt协议和emqttd开源项目个人理解(12) - Hook使用和连接Kafka发送消息,使用ekaf库
一、工作环境准备erlang kafka客户端库使用的是https://github.com/helpshift/ekafemq使用的是v2.3.5版本,https://github.com/emqtt/emq-relxkafka的运行环境准备,http://blog.csdn.net/libaineu2004/article/details/79202408我们以插件的形式来实现,我的插件路径是...原创 2018-03-01 16:53:58 · 3481 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(6) - 使用Wireshark分析mqtt协议
MQTT V3.1.1协议报文 报文结构固定报头(Fixed header) 可变报头(Variable header) 报文有效载荷(Payload) 固定报头Bit 7 6 5 4 3 2 1 0 byte1 MQTT Packet type Flags byte2… Remaining...原创 2017-12-11 16:02:22 · 11133 阅读 · 4 评论 -
我的mqtt协议和emqttd开源项目个人理解(10) - 建立高可用集群,负载均衡haproxy
方案1:Nginx+Keepalived+emq+MySQL双机热备,MySQL用于数据持久化方案2(推荐):HAProxy+Keepalived+emq+MySQL双机热备方案3:HAProxy+confd+emq+etcd问:我还有一个疑问,使用了nginx或者haproxy真的能提升性能吗?那nginx或haproxy本身服务器岂不是压力山大,所有数据都要经过它转发。答:它不...原创 2018-01-15 11:40:41 · 6660 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(11) - EMQ 一个客户链接的资源消耗
本文参考了https://www.ttalk.im/topics/63?from=singlemessageErlang进程消耗EMQ对客户端链接使用链接进程(emqtt_client)和session进程(emqtt_session)分开的策略。 当一个mqtt的客户端连接到EMQ的服务器上的时候,首先会建立一个负责管理连接的进程(emqtt_client),当验证客户端有效后会建立另一个...原创 2018-01-22 09:55:36 · 6176 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(9) - 集群和Mnesia源码分析
学习mqtt协议和emqttd开源项目http://emqtt.com/emqttd源码版本号是v1.1.3。http://emqtt.com/downloads/1113原创 2017-12-16 10:49:57 · 2099 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(5) - hook的使用,源码分析
学习mqtt协议和emqttd开源项目http://emqtt.com/emqttd源码版本号是v1.1.3。http://emqtt.com/downloads/1113原创 2017-12-07 17:49:20 · 1774 阅读 · 2 评论 -
我的mqtt协议和emqttd开源项目个人理解(4) - 客户端CleanSession=0时,上线接收离线消息,源码分析
学习mqtt协议和emqttd开源项目http://emqtt.com/emqttd源码版本号是v1.1.3。http://emqtt.com/downloads/11131、-module(emqttd_client).[html] view plain copyhandle_info({inet_asy原创 2017-12-07 16:38:27 · 3397 阅读 · 1 评论 -
erlang高性能网络库esockd的编译和使用(五)-热更新
讲解一下,如何实现rebar热更新程序。原创 2017-11-13 10:21:49 · 813 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(16) - [error] Autocluster exception: {badmatch,undefined}
emq2.3.X会出现这个错误,怎么破?出现这个错误,emq程序无法正常启动,1883端口没有在监听。 emqttd broker is starting...[ok]emqttd alarm is starting...[ok]emqttd mod supervisor is starting...[ok]emqttd bridge supervisor is startin...原创 2018-05-31 15:08:31 · 1119 阅读 · 0 评论 -
erlang如何获取本机MAC地址?
使用命令inet:getifaddrs().详情见:http://erlang.org/doc/man/inet.htmlgetifaddrs() -> {ok, Iflist} | {error, posix()}TypesIflist = [{Ifname, [Ifopt]}]Ifname = string()Ifopt = {flags, [Flag]} | ...原创 2018-07-11 16:23:54 · 817 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(17) - [error] Dependency luerl is specified as a dependency but is not...
编译源码出错:===> No entry for profile default in config. ===> Verifying dependencies... ===> Compiling jwerl make[2]: Leaving directory `/home/emq2.3.10/deps/jwerl' make[1]: Leaving directo...原创 2018-07-17 17:26:18 · 1428 阅读 · 0 评论 -
Mnesia迭代:提供一组函数来迭代表里的所有记录,firecat实践
1、Mnesia提供了如下几个函数遍历所有记录 mnesia:foldl(Fun, Acc0, Tab) -> NewAcc | transaction abort mnesia:foldr(Fun, Acc0, Tab) -> NewAcc | transaction abort mnesia:foldl(Fun, Acc0, Tab, LockTyp...原创 2018-09-28 17:32:15 · 403 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(25) - 协议里面Clean Session为0和1的区别
一、基本概念Session 会话定义定义:某个客户端(由ClientID作为标识)和某个服务器之间的逻辑层面的通信生命周期(存在时间):会话 >= 网络连接CleanSession 标记在Connect时,由客户端设置 0 —— 开启会话重用机制。网络断开重连后,恢复之前的Session信息。需要客户端和服务器有相关Session持久化机制。1 —— 关闭会话重用机制。...原创 2018-10-13 18:16:27 · 14613 阅读 · 1 评论 -
EMQ进程树/MQTT连接/订阅/发布源码流程分析【转载】
https://blog.csdn.net/hui6075/article/details/79495556写在前面EMQ作为一款优秀的开源MQTT broker,从一些库的使用以及框架的设计,可以看出作者也是非常精通Erlang的大牛!比如说对于集群化,作者自己实现了Ekka库,对于网络并发,作者自己实现了esockd。首先不论这些库性能如何,但敢于自己造轮子,会造轮子,绝对是对Er...转载 2018-09-27 10:26:01 · 1818 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(24) - emq v2.3.11源码成熟度如何?
源码:https://github.com/emqx/emqx-rel/tree/v2.3.11https://github.com/emqx/emqx/tree/v2.3.11/src从原作者那边了解到,总体还可以,但是做不到99.99%稳定。主要是连接内存占用没有保护。pubsub均衡时很稳定,但是集群或大量消息向少量订阅发布时会崩溃,小概率情况。EMQ中CPU是公平分配给MQ...原创 2018-09-21 10:06:04 · 1361 阅读 · 4 评论 -
erlang:list_to_binary
list_to_binary:字符串转二进制 例子 结果 atom_to_list(hello). "hello" list_to_atom("hello"). hello binary_to_list(<<"hello">>). ...原创 2018-09-14 17:13:35 · 1589 阅读 · 0 评论 -
看完让你彻底搞懂Websocket原理
http://www.blue-zero.com/WebSocket/ -- 在线测试偶然在知乎(https://www.zhihu.com/question/20215561)上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有。所以转到我博客里,分享一下。比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗,纯粹为分享。废话这么多了,...转载 2018-09-19 16:50:03 · 12319 阅读 · 1 评论 -
我的mqtt协议和emqttd开源项目个人理解(21) - 关于emq的payload的使用和加密
问:payload传输过程中会不会拆包,粘包?业务层拿到payload还需要自己组包吗?答:不需要,mqtt协议有约定,emq会帮忙处理tcp的粘包拆包。总之,直接拿出来用即可。 问:payload怎么加密?答:安全,如果考虑商业用途的话,建议TLS+业务加密,双重加密。TLS私钥如果没有被暴露的话,基本无解。双重加密比较重要,因为如果是端,像Android和iOS其实是可以绕...原创 2018-09-13 17:54:04 · 1534 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(23) - websocket客户端连接过程分析(Wireshark抓包+源码分析)
我们可以使用emq自带的Dashboard插件,进行websocket调试,打开谷歌浏览器输入网址,其中192.168.83.128是emq所在的IP地址:http://192.168.83.128:18083/#/websocket用户名:admin,密码:publicWebSocket URI:ws(s)://192.168.83.128:8083/mqttTCP URI:tc...原创 2018-09-18 16:28:31 · 2013 阅读 · 2 评论 -
我的mqtt协议和emqttd开源项目个人理解(22) - 关于客户端上线自动订阅主题
通过修改配置文件即可实现。 emq v1.1.3,rel\emqttd\etc\emqttd.config‘subscription’扩展模块支持客户端上线时,自动订阅或恢复订阅某些主题(Topic):%% Modules {modules, [ %% Client presence management module. %% Publis...原创 2018-09-18 16:23:14 · 1323 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(20) - 如果客户端clientid为空,emq会随机帮忙生成
mqtt v3.1.1协议有规定clientid可以为空,所以当客户端clientid为空,emq会随机帮忙生成。 一、源码emq 1.1.3 -- emqttd_protocol.erl客户端经过TCP三次握手建立连接之后,会发起mqtt connect packet,服务器接收到后开始处理这个数据包,入口函数就是如下的源文件,process函数:https://github.c...原创 2018-09-13 09:53:35 · 5369 阅读 · 0 评论 -
使用 WebSocket 客户端连接 MQTT 服务器
https://www.jianshu.com/p/4fd95cae1a9chttps://github.com/mqttjs/MQTT.js/tree/master/examples firecat注:我们可以使用emq自带的Dashboard插件,进行websocket调试,打开谷歌浏览器输入网址,其中192.168.83.128是emq所在的IP地址:http://192...转载 2018-09-18 11:10:14 · 6815 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(19) - emq软件版本升级之后,因插件版本不对而引发的问题
本人把emq2.3.7版本写的插件copy到新版本emq2.3.11之后,编译可以通过,但是运行报错。经过反复调试发现,是版本号有区别造成:/home/emqx-rel-2.3.?/deps/emq_auth_clientid/Makefileemq v2.3.7PROJECT = emq_auth_clientidPROJECT_DESCRIPTION = Authenticat...原创 2018-09-12 15:07:32 · 846 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(18) - 一个客户端sub很多主题和数据,出现宕机?使用本地共享订阅解决!
EMQ中CPU是公平分配给MQTT会话,大量pub消息到一个订阅,订阅不会拿到更多cpu,最终导致消息累积,内存溢出宕机。最好的解决办法是分组订阅,把消息打散,多个客户端订阅。问:请问一下,我现在的业务就是只使用一个sub,主题是\hello\#,去订阅数万个终端消息。请问针对这个问题,如何来优化业务逻辑?可以通过增加sub的方式吗?即把数万终端分成几个小组,每小组往一个主题p...原创 2018-08-13 17:12:06 · 3926 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(8) - 客户端subscribe消息的源码分析
学习mqtt协议和emqttd开源项目http://emqtt.com/emqttd源码版本号是v1.1.3。http://emqtt.com/downloads/1113源码写得比较绕,需要经过以下模块的调用,入口是emqttd_client模块,handle_info函数负责接收socket的数据:1、-module(emqttd_client)原创 2017-12-16 10:48:01 · 2571 阅读 · 0 评论 -
我的mqtt协议和emqttd开源项目个人理解(3) - 客户端publish消息QoS==0的源码分析
学习mqtt协议和emqttd开源项目http://emqtt.com/emqttd源码版本号是v1.1.3。http://emqtt.com/downloads/1113源码写得比较绕,需要经过以下模块的调用,入口是emqttd_client模块,handle_info函数负责接收socket的数据:1、-module(emqttd_client)原创 2017-12-07 16:07:43 · 2174 阅读 · 0 评论 -
erlang无图形界面的linux下如何使用observer:start(). --- ★firecat推荐★
问:如果我的erlang app部署在linux机器上,且linux机器上只能通过命令行的方式访问,没有安装图形界面相关的库。如果直接在Linux终端输入命令observer:start().,会报错:Eshell V8.3 (abort with ^G)1> observer:start().{error,{{load_driver,"No driver found"},原创 2017-10-06 17:07:17 · 2941 阅读 · 0 评论 -
如何让Erlang服务器程序在后台运行,即实现守护进程的形态运行(★firecat推荐★)
我们知道当创建erlang module时,让其在后台运行的方法是:终端输入命令:erl -detached -s hello start注:-s hello start运行hello:start()函数,-detached是后台运行的意思.但是当我们创建erlang application程序呢?如何实现后台运行?上述的方法可就不灵了。参考文章:Erlang/OTP 构建 Application...原创 2017-10-07 21:51:06 · 2386 阅读 · 0 评论 -
使用erlang ranch tcp开发服务端
http://blog.csdn.net/huang1196/article/details/38401197Ranch:简单来说,Ranch就是一个tcp acceptor pool,用于高并发下的tcp连接建立与管理。可以设置并发链接最大数量,在不关闭socket连接的情况下可以动态升级连接池。Cowboy就是使用的ranch。https://github.co转载 2017-10-03 10:38:02 · 1038 阅读 · 0 评论 -
erlang lists 系列函数功能与用法详解
http://blog.csdn.net/zhangjingyangguang/article/details/7377787OTP路径是\erl8.3\lib\stdlib-3.3\src\lists.erl一,带函数Pred1, all(Pred, List) -> boolean()如果List中的每个元素作为Pred函数的参数执行,结果都返回true转载 2017-09-29 17:25:21 · 3057 阅读 · 0 评论 -
erlang 接入远程shell控制台(请重点学习作业JCL模式)
http://blog.csdn.net/mycwq/article/details/43850735erlang shell是用户与 erlang 运行时系统交互的界面程序。事实上,erlang VM的运行不依赖任何shell,只要在启动的时候添加参数detached就可以脱离终端。-detachedStarts the Erlang runtime system d转载 2017-10-07 12:56:11 · 1851 阅读 · 0 评论 -
Linux下基于Erlang的高并发TCP连接压力实验
http://blog.csdn.net/zcc_0015/article/details/264076831、实验环境:联想小型机:操作系统:RedHat Enterprise LinuxServer release6.4(Santiago) 内核版本:Linux server1 2.6.32-358.el6.x86_64#1 SMP转载 2017-10-07 17:12:39 · 647 阅读 · 0 评论 -
Erl 命令笔记
http://blog.csdn.net/jackybay/article/details/8445019所谓的启动erlang run-time system支持多种args....erl +cmd 一般解析为 emulator flag-cmd 一般为普通flag 可以从init;get_arguments获取转载 2017-10-07 16:23:59 · 1235 阅读 · 0 评论 -
一种以standalone方式启动erlang应用的方法(守护进程)
http://cryolite.iteye.com/blog/383927erlang默认运行时是带有终端的,在开发过程中可以很方便的检查程序的bug,但在开发完成后,应该以后台的方式运行服务。-noshell (该参数关闭终端,但依然不会后台运行,有输出时会直接打印到当前屏幕-noinput 禁止终端下的输入-hidden 隐藏运行-detach转载 2017-10-07 12:59:58 · 811 阅读 · 0 评论