文章来源:公众号-智能化IT系统。

案例介绍

本文介绍的案例是TCP网络服务器的构建,用最原始的方式(非OTP)。其功能很简单,通过网络TCP接口接收数据,按照指定的格式解析,并把数据存储至MongoDB。接口消息的格式有明确规定,每条消息之间用“|”分割,用“#”标识一群消息的结束,消息中的每个字段格式为“字段名:字段值”,每个字段之间以空格分割。

该案例原先是用C#开发,后期随着数据的增长,一天到了数十亿,一连串的问题接连而来。频繁崩溃,性能跟不上等等。当时单机处理的上限是一天6亿。

后来在休闲时间用erlang语言实现了同样的功能,最后测试的性能和稳定性有了不错的体现,因为当时时间有限,没有把他优化的很好,但是是一个很有意思的应用。

考虑Erlang的原因

当前早就进入了多核时代,一台服务器的CPU不可能只有一个,系统会否合理的利用是一个问题,大部分系统无法完全的利用,甚至只用了一个CPU,无疑这是对资源的浪费。而Erlang可以让程序员轻松的解决。

Erlang在国内尚未大范围的普及,大型的公司和系统能见到的非常少。但是价值不容小看。目前很流行的rabbitMQ ,就是用Erlang开发的。Erlang的特点可以用两个字形容之:土,快。

土:Erlang语言非常难以上手,甚至被评价为对程序员的眼睛最有杀伤力的语言,一开始编写会非常头疼。而且,其数据抽象能力实在不敢恭维,复杂的逻辑使用之会非常难受。

快:即其性能的优异表现了,使用Erlang可以充分的利用上多核资源,效率非常的快。那么为什么其有这种功力呢,有以下几点特征,供参考:

  1. 如果您是一个java或C++等常用语言的开发者,您可以认为Erlang没有变量,所有的变量只能赋值一次。

  2. Erlang没有线程的概念,Erlang由轻量级的进程组成。以充分利用多核CPU。

  3. Erlang没有共享内存的概念,所有的进程通过消息来传递信息。这一点就是和文章开端的描述是对应的。

  4. 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服务应用案例(最原始方式)的更多相关文章

  1. Beetle简单构建TCP服务

    使用Beetle构建TCP服务应用是件非常简单的事情,它并不需要你去关注Socket细节,如果你想用Socket编写高性能的TCP服务,那你要关注的东西非常多,异步数据处理,大量连接下的线程管理和连接 ...

  2. 如何使用 Java 构建微服务?

    [编者按]微服务背后的大理念是将大型.复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化.本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊 ...

  3. BeetleX之TCP服务应用详解

    BeetleX是.net core平台下的一个开源TCP 通讯组件,它不仅使用简便还提供了出色性能的支持,可以轻易让你实现上百万级别RPS吞吐的服务应用.组件所提供的基础功能也非常完善,可以让你轻易扩 ...

  4. 8.14 day32 TCP服务端并发 GIL解释器锁 python多线程是否有用 死锁与递归锁 信号量event事件线程q

    TCP服务端支持并发 解决方式:开多线程 服务端 基础版 import socket """ 服务端 1.要有固定的IP和PORT 2.24小时不间断提供服务 3.能够支 ...

  5. Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯(本文) 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...

  6. 手把手教你用Spring Cloud和Docker构建微服务

    什么是Spring Cloud? Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集.Spring Cloud引入了云平台连接器(Cloud Connector)和服务连接 ...

  7. 构建memcached服务

    Q: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的增.删.改.查操作:安装memcached软件,并启动服务使用telnet测试memcached服务对memc ...

  8. 高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享

    一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d ...

  9. C#高性能TCP服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...

随机推荐

  1. [Swift]LeetCode412. Fizz Buzz

    Write a program that outputs the string representation of numbers from 1 to n. But for multiples of ...

  2. [Swift]LeetCode517. 超级洗衣机 | Super Washing Machines

    You have n super washing machines on a line. Initially, each washing machine has some dresses or is ...

  3. [Swift]LeetCode850. 矩形面积 II | Rectangle Area II

    We are given a list of (axis-aligned) rectangles.  Each rectangle[i] = [x1, y1, x2, y2] , where (x1, ...

  4. 了解django部署(Django + Uwsgi + Nginx)

    首先了解下基本概念: 1 WSGI WSGI:全称是Web Server Gateway Interface,是python应用程序或者框架和web服务器之间的一种接口,被广泛接受.WSGI不是服务器 ...

  5. 如何更简单方便地执行SQL操作?

    现在公司使用mybatis作为DAL层的框架. 使用起来比较简单,使用xml进行SQL的书写,java代码使用接口执行. 但在写一些简单SQL的时候会显得非常繁琐: xml和java分离(设计上为了解 ...

  6. Python内置函数(17)——divmod

    英文文档: divmod(a, b) Take two (non complex) numbers as arguments and return a pair of numbers consisti ...

  7. Python内置函数(31)——id

    英文文档: id(object) Return the “identity” of an object. This is an integer which is guaranteed to be un ...

  8. BBS论坛(三十三)

    33.celery实现邮件异步发送 (1)task.py pip install celery redis from celery import Celery from flask import Fl ...

  9. 初探React与D3的结合-或许是visualization的新突破?

    自诞生之初截止目前(2016年初),React可以说是前端界最流行的话题,如果你还不知道React是何物,你就该需要充充电了. d3是由纽约时报工程师开源的一个绘制基于svg的数据可视化工具,是近几年 ...

  10. 程序导致IIS服务器应用程序池停止

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0sAAAC6CAIAAADwAEEAAAAQMElEQVR4nO3dz4scV2IH8Ma7EB9CQC