问题标签 [system-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
16070 浏览

system-design - 面试:系统/API设计

这个问题是在一家大型软件公司提出的。我想出了一个简单的解决方案,我想知道其他人对此解决方案的感受。

您应该为一个系统设计一个 API 和一个后端,该系统可以将电话号码分配给居住在城市中的人们。电话号码将从 111-111-1111 开始,到 999-999-9999 结束。API 应使客户(城市中的人)能够执行以下操作:

  1. 当客户请求电话号码时,它会为他们分配一个可用号码。
  2. 有些客户可能想要花哨的数字,所以他们可以专门要求分配给他们的数字。如果请求的号码可用,则系统将其分配给他们,否则系统分配任何可用的号码。

系统不必知道哪个号码分配给哪个客户。同一个客户端可能会发出连续的请求并为自己获得多个电话号码,但系统不会受到打扰。在任何时候,系统只知道分配了哪些电话号码,哪些电话号码是免费的。

从 111-111-1111 到 999-999-9999 的数字大致对应 80 亿个数字。假设内存不是约束,我可以想到以下两种方法(几乎相似)。

  1. 维护一个长度为 80 亿的巨大布尔数组,并有一个next指向数组索引的指针(next初始化为零)。如果指向的值next不是空闲的,则转发next直到找到空闲的数字。当请求花哨的数字时,只需检查相应的索引位置是否空闲并返回数字即可。这种方法的缺点是,当以常规方式分配数字时,如果中间有一大块(比如 10 亿个)数字是通过花式分配分配的,那么next指针必须移动 10 亿次。

  2. 为了克服之前设计中提到的困难,我们可以使用某种链接的 hashmap。我们维护一个双向链表(这取代了之前设计中的数组)和另一个与列表长度相同的数组,其中数组的每个元素都指向列表中的相应元素。因此,在常规方法中分配数字时,我们在链表中推进一个指针,并将节点标记为分配时(与前面的方法相同)。在分配花式数字时,我们可以直接在列表中找到与请求的特殊数字相对应的节点,首先索引到数组中,然后跟随指针。一旦节点被识别,

让我知道我是否走在正确的轨道上。请告诉我我遗漏的任何重要细节。

0 投票
2 回答
1678 浏览

web-applications - 构建供内部和外部使用的应用程序 - 我如何构建它们?

我正在努力将我们公司的各种信息系统整合到一个基于 Web 的应用程序中。不小的壮举,但随着时间的推移,我们将逐步推出和改进。

该应用程序分为两个区域 - 一个仅限员工的门户,用于 Intranet,以及一个供客户访问的公共门户。

我创建这个没有问题,但我不确定如何去托管它。安全是我最大的担忧。鉴于我们的数据库将托管敏感信息(您可以确定我将加密和散列所有重要的东西以及所有常见的 XSS/CSRF/SQL 注入)

我是否在同一台服务器上同时运行应用程序和数据库?我是否在内部运行内部东西以保证其安全,并让公共系统通过 Web API 进行调用?

在这种情况下,可维护性、安全性和性能的最佳平衡是什么?

0 投票
4 回答
1877 浏览

python - 设计 - 如何处理时间戳(存储)以及何时执行计算;Python

我正在尝试确定(因为我的应用程序正在处理来自不同来源和不同时区、格式等的大量数据)如何最好地存储我的数据并使用它。

例如,我应该将所有内容都存储为 UTC 吗?这意味着当我获取数据时,我需要确定它当前所在的时区,如果它不是 UTC,则进行必要的转换以使其如此。(注意,我在 EST)。

然后,在对数据执行计算时,我应该提取(比如说它是 UTC)并进入我的时区(EST),所以当我查看它时是否有意义?我应该将其保留在 UTC 并进行所有计算吗?

很多这些数据是时间序列的,将被绘制成图表,并且图表将在 EST 中。

这是一个 Python 项目,所以假设我有一个数据结构:

我需要对此进行操作,通过确定当前时间(now())是否>最后一个+间隔(已经过去了 60 秒)?所以在代码中:

那有意义吗?我在任何地方都在使用 UTC,无论是存储的还是计算的……

此外,如果有人有关于如何在软件中使用时间戳的优秀文章的链接,我很乐意阅读它。可能像 Joel On Software 一样在应用程序中使用时间戳?

0 投票
0 回答
49 浏览

security - 等待处理的敏感瞬态数据的安全策略

我目前正在进行基于 REST API 的服务的 alpha 测试/开发,该服务代表其用户为客户端执行自动化任务。Web 应用程序托管在我的服务器上,任务由在后台服务中运行的工作人员处理。可能有许多服务实例跨多个服务器运行,具体取决于负载。

用户通过 API 创建会话,会话存储在数据库中并排队等待处理。然后用户为他们的会话发出命令。工作进程使会话出队并开始一一处理命令,直到用户关闭会话。命令结果存储在数据库中,供用户在完成后访问。

什么是确保命令输入在处理之前保持安全的好策略,因为它们可能包含不应泄露的敏感数据。处理后,可以删除输入,但我想向我的用户保证,我的系统处理的任何数据泄漏的可能性可以忽略不计。

0 投票
1 回答
495 浏览

python - Python 包设计和循环导入

我正在使用 Python 3.3.2 编写一个封装文件系统的包。我的项目如下所示:

PYTHONPATH=~/python.

问题是,file.py需要directory.py(例如, for File.get_directory())和directory.py需要file.py(例如, for Directory.get_files()),所以我有一个循环导入。

  1. 当我使用import directoryinfile.pyimport filein 时directory.py,它仅在我的工作目录为filesystem(即,当导入为本地时)时才有效。
  2. 当我使用import filesystem.directoryinfile.pyimport filesystem.filein 时directory.py,它工作得很好,除了写作filesystem.file.Filefilesystem.Directory.directory所有时间的审美滋扰。
  3. 奇怪的是,当我使用import filesystem.directory as directoryor时from filesystem.directory import Directory,我得到了循环导入错误'module' object has no attribute 'directory'。我的猜测是 whileimport ...是懒惰的,import ... asfrom ... import尝试评估模块并立即注意到循环性。
  4. 解决这个问题的一种方法是import filesystem.directory在使用它的函数内部。不幸的是,我的许多方法都使用它,并且在类中导入它似乎不起作用。

当然,这是可以解决的:吸收它并写作filesystem.directory.Directory;在方法中分配__import__一个全局变量以__init__供所有其他方法使用;定义FileDirectory在同一个文件中;等等。但这些妥协多于解决方案,所以我的问题仍然存在:

  1. 您将如何设计文件系统,其中文件类使用目录类,反之亦然?
  2. 更一般地说,您将如何处理(或避免)循环进口?

谢谢。

更新 [03.07.2013](主要是为了讨论)

我遇到的另一个解决方案是某种前向声明,在一个公共标头中包含空filedirectory类,然后是单独的实现(更像是属性添加)。虽然最终的设计非常简洁,但这个想法比 Pythonic 更接近 C++。

0 投票
1 回答
525 浏览

transparency - 网络中的透明结构 - 正确的术语?

我正在开发一个地址系统,它提供了一种隐藏应用程序固定地址(例如 IP 绑定)的机制。例如,应用程序可能被称为APP1. 如果此应用程序失败,此机制会默默地将备份实例的 IP 地址链接到抽象地址APP1。然而,与之交谈的程序APP1永远不会注意到这个隐藏的地址变化。

通常,人们将这种行为称为transparent隐藏和使事物不可见的行为与使事物透明的相反。

transparent正确的术语吗?如果是,为什么?这个论点是否来自一些不同的视角?

为了防止关于这个问题的评论和标记成为主题:我正在编写一个技术规范,这是系统开发过程中非常重要的一步,因此需要与系统编程相同级别的准确性,因此只需将其视为一个编程问题在更广泛的意义上。

0 投票
1 回答
7295 浏览

mysql - 以第三范式创建规范化数据库模式

我正在为我的大学二年级模型、系统分析和设计做一个小任务。我正在与一个应该很容易回答的问题作斗争,但我对自己的回答有一些疑问。

我将发布问题和我的答案。如果我的答案不正确,如果有人能抽出一点时间来查看它并把我推向正确的方向,我将不胜感激。

问题如下:

请参阅下页提供的可靠制药服务的 ERD,并在 3NF 中开发规范化的数据库模式。清楚地标明所有键。所有的表都应该是 3NF。在所有主键下划线,并用字母 FK 表示外键,例如…、Product-code (FK)、…。

请注意给定的 ERD

  • 并非所有字段都给出
  • 某些表可能不需要某些字段
  • 不显示主键和外键

在此处输入图像描述

我的答案:

注意: 在我的回答中,主键位于表格的开头

在 OrderItem 表中,我遗漏了 PatientName、RoomNumber(因为它已经包含它,所以我这样做是否正确?)

同样在 OrderItem 表中,我省略了 ChemicalName、Manufactorer、UnitType、Dosage 和特殊说明,因为我觉得这是 OrderItem 表的不必要字段并且已经包含在其他表中,我这样做是否正确?

非常感谢您花时间阅读我的问题,也感谢这个精彩网站的创建者和贡献者

欢呼

0 投票
1 回答
99 浏览

c++ - C ++类函数返回值VS对本地数据进行操作?

假设我们有C类,我们的流程如下

  1. 做功能1
  2. 做功能2
  3. 做功能3
  4. 做func4

其中每个函数对前一阶段的数据进行操作

从系统设计的角度来看,哪个更好?

  1. 使每个函数接受一个输入,返回其结果并将结果传递给下一个阶段
  2. 使每个 func 对 c 类中的数据成员进行操作,并且它们都返回 void

如果这两种策略是著名的设计模式,那么每种设计模式的名称是什么?

0 投票
0 回答
245 浏览

simulation - 数字系统设计:模型模拟错误

我真的很不同,我需要你的帮助!首先,这是我在数字系统设计方面的第一门课程,我们被要求做一些项目,它是一个 ALU(算术逻辑单元),它执行多项操作,如加法、减法、递增、递减、2 的补码和一些逻辑门。 ..但是在完成所有工作并尝试模拟项目后,我将所有输出都设为“未知”..

这是截图:

这是 ALU 代码:

这是测试台:

知道可能是什么问题吗?

谢谢大家:)

0 投票
1 回答
503 浏览

java - 分布式处理的最大吞吐量(使用 netty 4.0)

我们为分布式处理构建系统,并希望将 netty (4.0) 用于网络 I/O 堆栈。

以下情况:我们有一个生产者任务 A 和一个消费者任务 B。任务 A 以 64K 块生成数据并将其传输给任务 B。任务 B 在某些情况下可能是计算密集型的,并且消耗 64K 块的速度比任务 A 产生的慢. 任务A和B通过一个tcp通道连接。

我们考虑这种方法:任务 A 生成块并将其放入本地队列中。当 tcp 通道空闲并且下一个 64K 可以写入通道时,会自动从队列中取出一个块(netty 是否给我们这样的信号/事件?)。如果任务 A 上的队列超过了存储块的固定限制,我们会阻塞任务 A,直到任务 B 消耗完块。本质上,我们希望任务 A 的“接收器触发写入”能够充分利用 tcp 通道而不会拥塞它。这种设计的目标应该是最大的数据吞吐量。

现在有几个问题:)

这是实现最大吞吐量的好设计吗?充分利用 tcp 通道的更好设计是什么?

netty 是这些场景的正确框架吗?(我对 netty 很陌生,但我真的很喜欢框架的简洁抽象/设计!)

这样的设计用netty能实现吗?=>(它是否给我们来自接收站点的这样的信号/事件?)

使用 netty 实现最大吞吐量的最佳设计是什么?

还有其他更适合的框架吗?

欢迎任何想法和注意!

提前谢谢了!!!托比