当前位置: 首页 > 面试题库 >

选择分布式共享内存解决方案

厍彭薄
2023-03-14
问题内容

我的任务是为可大规模扩展的分布式共享内存(DSM)应用程序构建原型。原型仅用作概念验证,但我想通过选择稍后在实际解决方案中使用的组件来最有效地利用我的时间。

该解决方案的目的是获取来自外部源的数据输入,将其搅动并使结果可用于许多前端。这些“前端”将仅从缓存中获取数据并提供服务,而无需额外的处理。该数据的前端命中量实际上可以是每秒数百万。

数据本身非常不稳定。它可以(并且确实)快速变化。但是,前端应看到“旧”数据,直到处理和缓存了最新数据为止。处理和写入由单个(冗余)节点完成,而其他节点仅读取数据。换句话说:没有通读行为。

我一直在寻找像memcached这样的解决方案,但是这一特殊要求无法满足我们列出的 所有 要求:

  1. 该解决方案至少必须具有 Java客户端API ,并且该 API 的其余部分都是用Java编写的,并且我们是经验丰富的Java开发人员,因此它们维护得相当好。
  2. 解决方案必须完全有 弹性 :应该可以添加新节点而无需重新启动集群中的其他节点;
  3. 该解决方案必须能够处理 故障转移 。是的,我意识到这意味着一些开销,但是总体提供的数据大小并不大(最大1G),因此这应该不是问题。“故障转移”是指无缝执行,而无需在节点发生故障时像在内存缓存的客户端中那样硬编码/更改服务器IP地址。
  4. 理想情况下,应该可以指定数据重叠的程度(例如,在DSM集群中应存储多少个相同数据的副本);
  5. 不需要永久存储所有数据,但是可能需要对某些数据进行后处理(例如,序列化到数据库)。
  6. 价格 。显然,我们更喜欢免费/开源,但如果解决方案值得,我们很乐意支付合理的费用。无论如何,必须每天支付24小时的支持合同。
  7. 整个事情必须托管在 我们的数据中心中, 因此Amazon SimpleDB之类的SaaS产品不在范围之内。如果没有其他选择,我们只会考虑这一点。
  8. 理想情况下,解决方案应 严格一致 (如CAP);但是, 最终一致性 可以视为一种选择。

预先感谢您的任何想法。


问题答案:

看看Hazelcast。它是纯Java,开源(Apache许可)高度可扩展的内存中数据网格产品。它确实提供7X24支持。它确实解决了您所有的问题,我尝试在下面解释每个问题:

  1. 它具有本地Java客户端。
  2. 它是100%动态的。动态添加和删除节点。无需更改任何内容。
  3. 同样,一切都是动态的。
  4. 您可以配置备份节点数。
  5. Hazelcast支持持久性。
  6. Hazelcast提供的所有内容都是免费的(开源),并且确实提供了企业级的支持。
  7. Hazelcast是单个jar文件。超级好用。只需将jar添加到您的类路径即可。看一下主页上的屏幕显示。
  8. Hazelcast严格一致。您永远无法读取过时的数据。


 类似资料:
  • 本文向大家介绍Java分布式session存储解决方案图解,包括了Java分布式session存储解决方案图解的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要探讨集群后不同Web服务器获取Session数据的问题解决方案。 Session Stick Session Stick 方案即将客户端的每次请求都转发至同一台服务器,这就需要负载均衡器能够根据每次请求的会话标识(SessionId)

  • 共享内存是两个或多个进程共享的内存。 但是,为什么我们需要共享内存或其他通信方式呢? 重申一下,每个进程都有自己的地址空间,如果任何进程想要将自己的地址空间的某些信息与其他进程进行通信,那么只能通过IPC(进程间通信)技术进行。 我们已经知道,通信可以在相关或不相关的进程之间进行。 通常,使用管道或命名管道来执行相互关联的进程通信。 可以使用命名管道或通过共享内存和消息队列的常用IPC技术执行无关

  • EasySwoole对Swoole table进行了基础的封装。 方法列表 getInstance() 该方法用于获取TableManager管理器实例 add($name,array $columns,$size = 1024) 该方法用于创建一个table get($name):?Table 该方法用于获取已经创建好的table 示例代码 TableManager::getInstance()

  • shmat是shared memory attach的缩写。而attach本意是贴的意思。 如果进程要使用一段共享内存,那么一定要将该共享内存与当前进程建立联系。即经该共享内存挂接(或称映射)到当前进程。 shmdt则是shmat的反操作,用于将共享内存和当前进程分离。在共享内存使用完毕后都要调用该函数。 函数原型 #include <sys/types.h> #include <sys/shm.

  • 共享内存的控制 函数原型 #include <sys/ipc.h> #include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf); 参数 shmid 由shmget函数生成,不同的key值对应不同的id值。 cmd 操作字段,包括: 公共的IPC选项(ipc.h中): IPC_RMID //删除 IPC_SET

  • 创建共享内存,通过key返回id。 函数原型 #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); 参数 key 不消多说 size 欲创建的共享内存段的大小 shmflg 共享内存段的创建标识: 公共的IPC选项(在/usr/include/linux/ipc.h中定义)