我在这里遇到了一个问题.我的目标是构建一个框架,以允许集成不同的流量模拟模型.这种集成基于链接连接,链接成本和模拟之间的车辆的共享.
为了进行分布式仿真,我计划建立一个"协调器"(星形拓扑).所有参与的模拟只需注册,并只与协调员交谈.然后协调员协调每次模拟之间各种任务的执行.
分布问题的一个快速示例是,当一个模拟"负责"某些对象(如道路)时.另一个是其他道路的"负责人".但是,这些道路是相互连接的(因此,我们需要在这些模拟之间进行同步,并且需要能够远程交换数据/调用方法).
我已经看过RMI了,我认为它可能适合这项任务.(以抽象出必须创建一个线上信令规则).
这样理智吗?这里的问题是模拟参与者需要将他们的一些数据存储集中在"协调器"中,以确保模拟之间的显式同步.此外,一些模拟可能需要来自其他模拟的组件或方法.(因此使用RMI的想法).
我的基本方法是让'协调员'运行一个巨大的RMI注册表.每个模拟只需查找注册表中的所有内容,确保在每个步骤中使用正确的对象.
任何人都有任何关于沿着这条道路前进的提示
我的应用程序在我的四核机器上运行良好.它是"令人尴尬的并行",具有大约100K的进程,因此非常适合在一组机器上运行.但是,我无法找到有关如何在群集中的所有可用节点上传播所有这些进程的文档.
分布式Erlang的文档似乎侧重于服务器 - 客户端应用程序,其中每个节点都是运行单个应用程序的客户端,并且您手动指定哪个节点运行哪个进程.
多层和/或分布式应用程序,它们具有相同的含义吗?
当我们谈论这些应用程序中的层时,它是物理层(数据库,浏览器,Web服务器......)还是逻辑层(数据访问层,业务层......)?
我一直在研究建立分布式会话环境的意义,并希望确保我没有遗漏任何重点.
关于开发将在分布式会话环境中运行的应用程序,我发现的主要开发问题是可能在会话中保留的数据丢失.显然,所有内容都必须被序列化或转换为无状态(或两者的组合),这对于已经编码用于繁重会话使用的任何应用程序来说可能是一项重要任务.
我应该注意其他任何潜在的问题或影响吗?
编辑:更具体(作为示例),我指的是servlet容器环境中的Java Web应用程序服务器端会话.
我有一个简单的模块:
-module(dist).
-compile([add/3]).
add(From,X,Y) ->
From ! X+Y.
Run Code Online (Sandbox Code Playgroud)
我正在启动两个节点.
一个用
erl -sname foo
Run Code Online (Sandbox Code Playgroud)
和另一个
erl -sname bar
Run Code Online (Sandbox Code Playgroud)
在酒吧节点我正在做:
> c(dist).
{ok,dist}
> self().
<0.37.0>
> spawn('foo@unknown-00-23-6c-83-af-bd', dist, add, [self(), 3, 5]).
Run Code Online (Sandbox Code Playgroud)
但我得到的反应是:
Error in process <0.48.0> on node 'foo@unknown-00-23-6c-83-af-bd' with exit value: {undef,[{dist,add,[<8965.37.0>,3,5]}]}
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?我想知道这是否意味着我的foo节点没有定义这个模块?我不认为它需要它,但问题并没有通过编译foo节点中的dist来解决,所以我猜这不是问题.
想象一下,您在不同的系统上有2个实体,并且需要根据与其中一个或两个相关的信息执行某种更改其中一个或两个的事务,并且要求对这两个实体的更改都将完成,或者它们都不会.
简单的例子,基本上必须在2个独立的硬件上运行2行:
my_bank.my_account -= payment
their_bank.their_account += payment
Run Code Online (Sandbox Code Playgroud)
据推测,存在专门针对这种情况存在的算法或习语,在存在对其他尝试访问相同值的情况下正确地工作(对于某些可预测的正确定义).的两阶段提交协议似乎是一种这样的方法.是否有更简单的替代方案,可能有更多限制?(例如,也许他们要求没有系统可以完全关闭或无法响应.)或者可能有更复杂的系统在某种程度上更好?关于此事,是否有标准或备受好评的文本?
假设我有一个名为"server"的节点,它会生成一个名为"server1"的进程,如下所示:
register(server1,spawn(module, generate_new_server, []))
Run Code Online (Sandbox Code Playgroud)
如何从名为"user"的其他节点向"server1"发送消息?
使用net_adm我只能ping节点"server",而不能生成节点"server1".我想我启动服务器的方式有问题,即
erl -sname server
Run Code Online (Sandbox Code Playgroud)
现在,如果我在另一台机器上
erl -sname user
net_adm:ping('server@pc')
Run Code Online (Sandbox Code Playgroud)
从"user @ pc"我可以连接到它,但如果我这样做
erl -sname user
net_adm:ping('server1@pc')
Run Code Online (Sandbox Code Playgroud)
它告诉我无法到达节点.是否有不同的语法用于连接"server1"?
如果我发送 1000 个“Hello World!” UDP 消息(12 字节 + 28 IP/UDP 开销),我观察到在接收端我只缓冲 658(总是相同的数字,658*40 = 26320 字节)。我这样做,通过在服务器上睡觉时发送 UDP 消息(在创建套接字之后)。
奇怪的是,服务器上的 SO_RCVBUF 选项是 42080 字节。所以,我想知道为什么我不能缓冲 1000 条消息。你知道剩下的 15760 字节都花在哪里了吗?
在服务器代码下方(其中 distrib.h 包含套接字和信号处理函数的基本错误处理包装器):
#include "distrib.h"
static int count;
static void sigint_handler(int s) {
printf("\n%d UDP messages received\n",count);
exit(0);
}
int main(int argc, char **argv)
{
struct addrinfo* serverinfo;
struct addrinfo hints;
struct sockaddr_storage sender;
socklen_t len;
int listenfd,n;
char buf[MAXLINE+1];
if (argc != 2) {
log_error("usage: %s <port>\n", argv[0]);
exit(1);
}
Signal(SIGINT,sigint_handler);
bzero(&hints,sizeof(hints));
hints.ai_family …Run Code Online (Sandbox Code Playgroud) 看起来像Go正在获得牵引力,并且有很多有趣的项目使用它.
但是,我经常听到一个观点,即Go主要关注的是单机,与Erlang OTP不同,它对构建分布式系统没有很好的支持.
那么,Go可用于构建可靠的分布式系统的框架和方法是什么?
重要的是 - 这样的框架应该经过战斗测试并在重负载的生产中使用,而不仅仅是在GitHub上流行.
只有在满足条件且没有竞争条件的情况下,是否可以插入或更新集合中的项目?
例如,假设我有一个带有timestamp字段和temperature字段的集合.只有在时间戳至少有一个小时的情况下才能更新特定项目吗?我知道我可以(步骤1)通过一次调用检查时间戳,然后(步骤2)进行一些数学运算以查看时间戳是否超过一小时前,然后(步骤3)更新集合中的项目(如果是).
但是如果另一个客户端在此客户端运行步骤2时更新客户端,则会失败.然后,当我只需要一个时,会发生两次更新.
这不是我正在处理的具体案例,但说明了我的问题.如果mongo操作依赖于另一个mongo操作,那么如何解决竞争条件?
concurrency multithreading distributed race-condition mongodb
distributed ×10
erlang ×3
java ×2
c ×1
concurrency ×1
database ×1
go ×1
layer ×1
mongodb ×1
multi-tier ×1
rmi ×1
session ×1
simulation ×1
sockets ×1
udp ×1