通过Erlang构建TCP服务应用案例(最原始方式)
文章来源:公众号-智能化IT系统。
案例介绍
本文介绍的案例是TCP网络服务器的构建,用最原始的方式(非OTP)。其功能很简单,通过网络TCP接口接收数据,按照指定的格式解析,并把数据存储至MongoDB。接口消息的格式有明确规定,每条消息之间用“|”分割,用“#”标识一群消息的结束,消息中的每个字段格式为“字段名:字段值”,每个字段之间以空格分割。
该案例原先是用C#开发,后期随着数据的增长,一天到了数十亿,一连串的问题接连而来。频繁崩溃,性能跟不上等等。当时单机处理的上限是一天6亿。
后来在休闲时间用erlang语言实现了同样的功能,最后测试的性能和稳定性有了不错的体现,因为当时时间有限,没有把他优化的很好,但是是一个很有意思的应用。
考虑Erlang的原因
当前早就进入了多核时代,一台服务器的CPU不可能只有一个,系统会否合理的利用是一个问题,大部分系统无法完全的利用,甚至只用了一个CPU,无疑这是对资源的浪费。而Erlang可以让程序员轻松的解决。
Erlang在国内尚未大范围的普及,大型的公司和系统能见到的非常少。但是价值不容小看。目前很流行的rabbitMQ ,就是用Erlang开发的。Erlang的特点可以用两个字形容之:土,快。
土:Erlang语言非常难以上手,甚至被评价为对程序员的眼睛最有杀伤力的语言,一开始编写会非常头疼。而且,其数据抽象能力实在不敢恭维,复杂的逻辑使用之会非常难受。
快:即其性能的优异表现了,使用Erlang可以充分的利用上多核资源,效率非常的快。那么为什么其有这种功力呢,有以下几点特征,供参考:
如果您是一个java或C++等常用语言的开发者,您可以认为Erlang没有变量,所有的变量只能赋值一次。
Erlang没有线程的概念,Erlang由轻量级的进程组成。以充分利用多核CPU。
Erlang没有共享内存的概念,所有的进程通过消息来传递信息。这一点就是和文章开端的描述是对应的。
Erlang进程之间传递数据非常快
综合以上的特征,需要高并发,高稳定性,并且中间逻辑简单的系统,Erlang是非常不错的选择。
案例实现
该案例实现的关键点将在这里分享,包括关键的源码。
1. 建立TCP socket,并监听
{ok, Listen} = gen_tcp:listen(28801, [list, {packet, 0}, {reuseaddr, true}, {active, once}]),
这里注意消息接收模式是active once,即半阻塞模式。接收模式的不同对系统影响很大,具体使用需要谨慎。
2. 建立MongoDB的连接,并保存
MongoDB需要下载公共包,mongodb-erlang-refactor,然后编译,小编阅读了其中的代码,部分的MongoDB需要略做修改。
--建立连接
mongo_id_server:init([])
--存储数据
savemongo(List,Con,Cat) ->
try
[mongo:do(unsafe, master, Con, 'SOC_ToBeBuffered', fun() ->
mongo:insert(list_to_atom(Cat), Val)
end) || Val <- List]
catch
_:_ -> io:format("Error~p~n",[calendar:local_time()]),
exit("stop")
end.
3.在接收到数据后,开启进程处理
Erlang创建进程使用Spawn,Pset = spawn(fun tcpReceiverMulBloPool:dataprocess1/0),具体处理逻辑见下。
该案例中没有用Erlang OTP来开发,所以算是最原始的代码,现在把主要的逻辑实现的代码分享如下,因为时间急迫,注释没有加,感兴趣的可以通过扫描文章下方的二维码关注公众号:智能化IT系统,进一步的沟通了解。最终,在笔记本电脑上测试,每天处理的数据量可以达到10亿,笔记本的配置是4核,主频2.5,内存4G,大家可以按照案例的业务场景自己来测试。
公众号-智能化IT系统。每周都有技术文章推送,包括原创技术干货,以及技术工作的心得分享。扫描下方关注。
通过Erlang构建TCP服务应用案例(最原始方式)的更多相关文章
- Beetle简单构建TCP服务
使用Beetle构建TCP服务应用是件非常简单的事情,它并不需要你去关注Socket细节,如果你想用Socket编写高性能的TCP服务,那你要关注的东西非常多,异步数据处理,大量连接下的线程管理和连接 ...
- 如何使用 Java 构建微服务?
[编者按]微服务背后的大理念是将大型.复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化.本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊 ...
- BeetleX之TCP服务应用详解
BeetleX是.net core平台下的一个开源TCP 通讯组件,它不仅使用简便还提供了出色性能的支持,可以轻易让你实现上百万级别RPS吞吐的服务应用.组件所提供的基础功能也非常完善,可以让你轻易扩 ...
- 8.14 day32 TCP服务端并发 GIL解释器锁 python多线程是否有用 死锁与递归锁 信号量event事件线程q
TCP服务端支持并发 解决方式:开多线程 服务端 基础版 import socket """ 服务端 1.要有固定的IP和PORT 2.24小时不间断提供服务 3.能够支 ...
- Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯
Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...
- 手把手教你用Spring Cloud和Docker构建微服务
什么是Spring Cloud? Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集.Spring Cloud引入了云平台连接器(Cloud Connector)和服务连接 ...
- 构建memcached服务
Q: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的增.删.改.查操作:安装memcached软件,并启动服务使用telnet测试memcached服务对memc ...
- 高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享
一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d ...
- C#高性能TCP服务的多种实现方式
哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...
随机推荐
- [Swift]LeetCode189. 旋转数组 | Rotate Array
Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: ...
- [Swift]LeetCode277. 寻找名人 $ Find the Celebrity
Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...
- [Abp 源码分析]八、缓存管理
0.简介 缓存在一个业务系统中十分重要,常用的场景就是用来储存调用频率较高的数据.Abp 也提供了一套缓存机制供用户使用,在使用 Abp 框架的时候可以通过注入 ICacheManager 来新建/设 ...
- 11.Flask钩子函数
在Flask中钩子函数是使用特定的装饰器的函数.为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码,那么这种函数就叫做钩子函数. before_first_requ ...
- Redis学习——数据结构介绍(四)
一.简介 作为一款key-value 的NoSQL数据库,Redis支持的数据结构比较丰富,有:String(字符串) .List(列表) .Set(集合) .Hash(哈希) .Zset(有序集合) ...
- redis 系列13 集合对象
一. 集合对象概述 这里的集合是string类型的无序集合,在集合对象中集合成员是唯一的,这就意味着集合中不能出现重复的数据.集合是通过哈希表实现的,集合中最大的成员数为 232-1 (4294967 ...
- Python爬虫入门教程 17-100 CSD*博客抓取数据
写在前面 写了一段时间的博客了,忽然间忘记了,其实CSD*博客频道的博客也是可以抓取的,所以我干了..... 其实这事情挺简单的,打开CSDN博客首页,他不是有个最新文章么,这个里面都是最新发布的文章 ...
- 两种方法操作其它mac应用的窗口
(图文基本无关) 如果单纯说简单方便,其使用AppleScript更好,特别是现在有了JS的加入,比如: (* This Apple script will resize any program wi ...
- RecyclerView与ListView 对比浅析:缓存机制
一. 背景 PS:相关知识:ListView与RecyclerView缓存机制原理大致相似,如下图所示: 滑动过程中,离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取, ...
- Docker系列05—Docker 存储卷详解
本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...