- 浏览: 2679156 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
分布式程序指设计用于运行在网络中的可以通过消息传递相互交流彼此的活动的计算机上的程序
分布式应用的好处:Performance、Reliability、Scalability、Intrinsically distributed application、Fun、
1, key-value server的简单例子:
2, 同一机器上Client-Server的key-value server例子:
3, 局域网内不同机器做Client-Server的key-value server例子:
4, Internet上不同主机的Client-Server的key-value server的例子:
1)确保4369端口对TCP和UDP都开放,epmd(Erlang Port Mapper Daemon)这个程序需要使用该端口
2)如果想使用的端口为Min和Max,则确保这些端口也是打开的
Distribution Primitives
远程Spawning
一般写分布式程序时不会直接用这些BIFs,而是使用一些封装好的libraries
rpc模块里最常用的方法是:
对于分布式Erlang节点,它们必须使用cookie
cookie不会跨网络发送,而是仅仅用于初始化session认证
有三种设置cookie的方式:
1,在$HOME/.erlang.cookie文件里写入,然后chmod 400 .erlang.cookie只允许文件所有者访问
2,$ erl -setcookie AFRTY12ESS...,不安全,ps命令可以看到
3,erlang:set_cookie(node(), C)
分布式Erlang的主要问题是不安全,client可以在server机器上spawn任意进程,下面的调用会摧毁系统:
所以我们需要给出一定的限制,比如认证机制,lib_chan就是一个控制访问的库(作者自己在本书代码中写的一个库)
例如如下配置文件
mod_name_server.erl
试试:
分布式应用的好处:Performance、Reliability、Scalability、Intrinsically distributed application、Fun、
1, key-value server的简单例子:
-module(kvs). -export([start/0, store/2, lookup/1]). start() -> register(kvs, spawn(fun() -> loop() end)). store(Key, Value) -> rpc({store, Key, Value}). lookup(Key) -> rpc({lookup, Key}). rpc(Q) -> kvs ! {self(), Q}, receive {kvs, Reply} -> Reply end. loop() -> receive {From, {store, Key, Value}} -> put(Key, {ok, Value}), From ! {kvs, true}, loop(); {From, {lookup, Key}} -> From ! {kvs, get(Key)}, loop() end. %%%%%%%%% 1> kvs:start(). true 2> kvs:store({location, joe}, "Stockholm"). true 3> kvs:store(weather, raining). true 4> kvs:lookup(weather). {ok,raining} 5> kvs:lookup({location, joe}). {ok,"Stockhom"} 6> kvs:lookup({location, jane}). undefined
2, 同一机器上Client-Server的key-value server例子:
$ erl -sname gandalf (gandalf@loalhost) 1> kvs:start(). true $ erl -sname bilbo (bilbo@localhost) 1> rpc:call(gandalf@localhost, kvs, store, [weather, fine]). true (bilbo@localhost) 2> rpc:call(gandalf@localhost, kvs, lookup, [weather]). {ok,fine} (gandalf@loalhost) 2> kvs:lookup(weather). {ok, fine}
3, 局域网内不同机器做Client-Server的key-value server例子:
doris $ erl -name gandalf -setcookie abc (gandalf@doris.myerl.example.com) 1> kvs:start(). true george $ erl -name bilbo -setcookie abc (bilbo@george.myerl.example.com) 1> rpc:call(gandalf@doris.myerl.example.com, kvs, store, [weather, cold]). true (bilbo@george.myerl.example.com) 2> rpc:call(gandalf@doris.myerl.example.com, kvs, lookup, [weather]). {ok, cold}
4, Internet上不同主机的Client-Server的key-value server的例子:
1)确保4369端口对TCP和UDP都开放,epmd(Erlang Port Mapper Daemon)这个程序需要使用该端口
2)如果想使用的端口为Min和Max,则确保这些端口也是打开的
$ erl -name ... -setcookie ... -kernel inet_dist_listen_min Min \ inet_dist_listen_max Max
Distribution Primitives
@spec spawn(Node, Fun) -> Pid @spec spawn(Node, Mod, Func, ArgList) -> Pid @spec spawn_link(Node, Fun) -> Pid @spec spawn_link(Node, Mod, Func, ArgList) -> Pid @spec disconnect_node(Node) -> bool() | ignored @spec monitor_node(Node, Flag) -> true @spec node() -> Node @spec node(Arg) -> Node @spec nodes() -> [Node] @spec is_alive() -> bool() {RegName, Node} ! Msg
远程Spawning
-module(dist_demo). -export([rpc/4, start/1]). start(Node) -> spawn(Node, fun() -> loop() end). rpc(Pid, M, F, A) -> Pid ! {rpc, self(), M, F, A}, receive {Pid, Response} -> Response end. loop() -> receive {rpc, Pid, M, F, A} -> Pid ! {self(), (catch apply(M, F, A))}, loop() end. %%%%%%%%%%%% doris $ erl -name gandalf -setcookie abc (gandalf@doris.myeerl.example.com) 1> george $ erl -name bilbo -setcookie abc (bilbo@george.myerl.example.com) 1> (bilbo@george.myerl.example.com) 1> Pid = dist_demo:start('gandalf@doris.myerl.example.com'). <5094.40.0> (bilbo@george.myerl.example.com) 1> dist_demo:rpc(Pid, erlang, node, []). 'gandalf@doris.myerl.example.com'
一般写分布式程序时不会直接用这些BIFs,而是使用一些封装好的libraries
rpc global
rpc模块里最常用的方法是:
call(Node, Mod, Function, Args) -> Result|{badrpc, Reason}
对于分布式Erlang节点,它们必须使用cookie
cookie不会跨网络发送,而是仅仅用于初始化session认证
有三种设置cookie的方式:
1,在$HOME/.erlang.cookie文件里写入,然后chmod 400 .erlang.cookie只允许文件所有者访问
2,$ erl -setcookie AFRTY12ESS...,不安全,ps命令可以看到
3,erlang:set_cookie(node(), C)
分布式Erlang的主要问题是不安全,client可以在server机器上spawn任意进程,下面的调用会摧毁系统:
rpc:multicall(nodes(), os, cmd, ["cd /; rm -rf *"])
所以我们需要给出一定的限制,比如认证机制,lib_chan就是一个控制访问的库(作者自己在本书代码中写的一个库)
@spec start_server() -> true 配置文件默认为$HOME/.erlang/lib_chan.conf @spec start_server(Conf) -> true 配置文件: {port, NNNN} {service,S,password,P,mfa,SomeMod,SomeFunc,SomeArgsS} @spec connect(Host,Port,S,P,ArgsC) -> {ok, Pid} | {error, Whay}
例如如下配置文件
{port, 1234}. {service, nameServer, password, "ABXy45", mfa, mod_name_server, start_me_up, notUsed}.
mod_name_server.erl
-module(mod_name_server). -export([start_me_up/3]). start_me_up(MM, _ArgsC, _ArgS) -> loop(MM). loop(MM) -> receive {chan, MM, {store, K, V}} -> kvs:store(K, V), loop(MM); {chan, MM, {lookup, k}} -> MM ! {send, kvs:lookup(K)}, loop(MM); {chan_closed, MM} -> true end.
试试:
起一个Erlang session作为server 1> kvs:start(). true 2> lib_chan:start_server(). Starting a port server on 1234... true 另起一个Erlang session作为client 1> {ok, Pid} = lib_chan:connect("localhost", 1234, nameServer, "ABXy45", ""). {ok, <0.43.0>} 2> lib_chan:cast(Pid, {store, joe, "writing a book"}). {send,{store,joe,"writing a book"}} 3> lib_chan:rpc(Pid, {lookup, joe}). {ok, "writing a book"} 4> lib_chan:rpc(Pid, {lookup, jim}). undefined
发表评论
-
ECUG III -- Elrang中国用户组第三次活动
2008-11-06 11:00 2234详情请见: http://ecug.org/ 大家也帮忙宣传 ... -
Erlang内存管理和运行模式笔记
2008-09-25 16:40 5380Erlang进程非常轻量级 进程间通过消息传递进行通讯 进程接 ... -
Erlang:一个通用的网络服务器
2008-09-24 16:50 6121原文: Erlang: A Generalized TCP S ... -
Erlang里的make
2008-09-22 17:38 3730Erlang自带一个make工具 我们看一个例子 目录结构: ... -
介绍Erlang里的Record
2008-09-12 15:52 8581原文: Erlang: An Introduction to ... -
Erlang与ActionScript3采用JSON格式进行Socket通讯
2008-09-02 16:37 6279前提: 需要下载as3corelib来为ActionScrip ... -
Erlang的JSON库
2008-09-02 15:40 9345使用下列JSON库: http://www.lshift.ne ... -
Erlang和ActionScript3的Socket通讯
2008-09-02 13:18 2875server.erl -module(server). ... -
Erlang和Ruby的Socket通讯
2008-09-01 22:12 2317server.erl -module(server). ... -
Erlang实现简单Web服务器
2008-09-01 17:59 5779转贴一个简单的Web服务器: httpd.erl %% h ... -
Mnesia用户手册:五,Mnesia高级特性
2008-09-01 17:27 7047本章描述了构建分布式、容错的Mnesia数据库相关的高级特性: ... -
Mnesia用户手册:四,事务和其他访问上下文
2008-08-29 00:06 6797本章讲述Mnesia事务系统和事务属性,它们让Mnesia成为 ... -
Mnesia用户手册:三,构建Mnesia数据库
2008-08-27 21:46 9207本章详细介绍了设计Mnes ... -
Mnesia用户手册:二,Mnesia快速上手
2008-08-27 14:09 9096本章介绍了Mnesia: 1) ... -
Mnesia用户手册:一,介绍
2008-08-26 15:47 7780Mnesia是一个分布式数据 ... -
OTP Design Principles: Supervisor Behaviour
2008-08-26 00:06 3092Supervisor Behaviour是一个用来实现一个su ... -
gen_event例子:terminal_logger
2008-08-25 16:23 1656定义三个terminal_logger: $$ termina ... -
OTP Design Principles: Gen_Event Behaviour
2008-08-25 16:06 17971,事件处理原则 在OTP里,event manager是一个 ... -
gen_fsm例子:code_lock
2008-08-22 18:35 2131改了一下代码,可以run了: %% code_lock.erl ... -
OTP Design Principles: Gen_Fsm Behaviour
2008-08-22 17:29 18161,有限状态机 FSM,有 ...
相关推荐
From Mathematics to Generic Programming 数学与泛型编程:高效编程的奥秘 英文版
### 使用C++进行并行和分布式编程 #### 核心知识点概述 本书《使用C++进行并行和分布式编程》由Cameron Hughes撰写,旨在帮助读者掌握如何利用现代多处理器计算机构建高效的软件系统。随着计算硬件的发展,多核...
** Gram:分布式系统的编程语言** Gram 是一种专为构建分布式系统设计的编程语言,它集成了编程语言、编译器和功能性编程的概念,旨在提供高效、安全和可扩展的解决方案。在分布式计算环境中, Gram 提供了独特的...
使用Python从计算/理解第一,数学第二的角度介绍贝叶斯方法和概率编程。
List-All-Programming-Telegram-Group:所有编程电报组列表
读书笔记:Programming In Scala 3rd Examples.《Scala编程》第三版代码
风GreatFree作为面向Internet的计算环境的通用且自包含的分布式编程范例世界上第一个通用且自包含的分布式编程范例世界上第一个通用且自包含的分布式编程范例视频课程(中文): : 视频课程(英语): : (所有视频...
标题“Distributed Programming with Java Technology”直截了当地指出了本书的主题:通过Java技术进行分布式编程。这表明本书旨在教授如何利用Java语言来构建分布式系统。 #### 描述解析 描述部分重复了标题,虽然...
数学和泛型编程-高效编程的奥秘(英文版pdf)原名:From_Mathematics_to_Generic_Programming,作者;Alexander A. Stepanov Daniel E. Rose
计算机技术笔记:编程开发、系统运维、网络知识、安全知识 IT Note: programming\system_admin\devops\network\secure
由于提供的文件信息中部分内容存在OCR扫描错误和遗漏,部分文字无法准确识别,且无法获得足够的详细内容以生成深入的知识点,因此以下内容将基于标题“Systems Programming --- Designing and Developing ...
黄金加密锁,支持五种加密算法。可随时解密,支持所有文件!
Intel® 64 and IA-32 架构软件开发人员手册1~3卷,英文版 Intel® 64 and IA-32 ArchitecturesSoftware Developer’s ManualVolume (1, 2A, 2B, 2C, 3A, 3B and 3C):System Programming Guide
#shell编程学习笔记 ####Authors 类星体 ##变量 ####变量名 1. 首个字符必须为字母(a-z,A-Z) 或者_ 2. 中间不能有空格,可以使用下划线(_) 3. 不能使用其他标点符号 ####变量赋值 a=123 b=$a ####变量取值 普通...
10. **分布式计算框架**:Apache Spark、Hadoop MapReduce等框架简化了分布式计算任务,它们提供了高级抽象,如分布式数据集和容错机制。 在C++中实现分布式编程,开发者需要深入理解上述概念,并选择适合的库和...
Github编程语言统计Github项目中使用的编程语言统计通过Github Action自动更新用法新项目统计信息: python npps.py 趋势项目统计数据: python tpps.py新项目(编程语言)统计在新项目中使用的编程语言的百分比线...
“配置和编程通信(Configuring and Programming Communication)”、“F-Libraries”、“编译和启动安全程序(Compiling and commissioning a safety program)”等信息表明文档将会讲述如何对安全系统的通信进行...
Distributed Programming**:分布式编程探讨了如何构建跨越多台计算机的软件系统,重点关注通信协议、容错机制等问题。 - **12. Constraint Programming**:约束编程是一种解决问题的方法,通过定义问题的约束条件...
WBIT 1310 编程和问题解决本课程帮助学生培养使用 Java 编程语言解决问题的基本技能。 向学生介绍 Java 编程语言的基础知识,重点是原始数据类型、控制结构、方法、数组、类、对象、抽象、继承和多态。 学生学习良好...