问题标签 [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.
system-design - 面试:系统/API设计
这个问题是在一家大型软件公司提出的。我想出了一个简单的解决方案,我想知道其他人对此解决方案的感受。
您应该为一个系统设计一个 API 和一个后端,该系统可以将电话号码分配给居住在城市中的人们。电话号码将从 111-111-1111 开始,到 999-999-9999 结束。API 应使客户(城市中的人)能够执行以下操作:
- 当客户请求电话号码时,它会为他们分配一个可用号码。
- 有些客户可能想要花哨的数字,所以他们可以专门要求分配给他们的数字。如果请求的号码可用,则系统将其分配给他们,否则系统分配任何可用的号码。
系统不必知道哪个号码分配给哪个客户。同一个客户端可能会发出连续的请求并为自己获得多个电话号码,但系统不会受到打扰。在任何时候,系统只知道分配了哪些电话号码,哪些电话号码是免费的。
从 111-111-1111 到 999-999-9999 的数字大致对应 80 亿个数字。假设内存不是约束,我可以想到以下两种方法(几乎相似)。
维护一个长度为 80 亿的巨大布尔数组,并有一个
next
指向数组索引的指针(next
初始化为零)。如果指向的值next
不是空闲的,则转发next
直到找到空闲的数字。当请求花哨的数字时,只需检查相应的索引位置是否空闲并返回数字即可。这种方法的缺点是,当以常规方式分配数字时,如果中间有一大块(比如 10 亿个)数字是通过花式分配分配的,那么next
指针必须移动 10 亿次。为了克服之前设计中提到的困难,我们可以使用某种链接的 hashmap。我们维护一个双向链表(这取代了之前设计中的数组)和另一个与列表长度相同的数组,其中数组的每个元素都指向列表中的相应元素。因此,在常规方法中分配数字时,我们在链表中推进一个指针,并将节点标记为分配时(与前面的方法相同)。在分配花式数字时,我们可以直接在列表中找到与请求的特殊数字相对应的节点,首先索引到数组中,然后跟随指针。一旦节点被识别,
让我知道我是否走在正确的轨道上。请告诉我我遗漏的任何重要细节。
web-applications - 构建供内部和外部使用的应用程序 - 我如何构建它们?
我正在努力将我们公司的各种信息系统整合到一个基于 Web 的应用程序中。不小的壮举,但随着时间的推移,我们将逐步推出和改进。
该应用程序分为两个区域 - 一个仅限员工的门户,用于 Intranet,以及一个供客户访问的公共门户。
我创建这个没有问题,但我不确定如何去托管它。安全是我最大的担忧。鉴于我们的数据库将托管敏感信息(您可以确定我将加密和散列所有重要的东西以及所有常见的 XSS/CSRF/SQL 注入)
我是否在同一台服务器上同时运行应用程序和数据库?我是否在内部运行内部东西以保证其安全,并让公共系统通过 Web API 进行调用?
在这种情况下,可维护性、安全性和性能的最佳平衡是什么?
python - 设计 - 如何处理时间戳(存储)以及何时执行计算;Python
我正在尝试确定(因为我的应用程序正在处理来自不同来源和不同时区、格式等的大量数据)如何最好地存储我的数据并使用它。
例如,我应该将所有内容都存储为 UTC 吗?这意味着当我获取数据时,我需要确定它当前所在的时区,如果它不是 UTC,则进行必要的转换以使其如此。(注意,我在 EST)。
然后,在对数据执行计算时,我应该提取(比如说它是 UTC)并进入我的时区(EST),所以当我查看它时是否有意义?我应该将其保留在 UTC 并进行所有计算吗?
很多这些数据是时间序列的,将被绘制成图表,并且图表将在 EST 中。
这是一个 Python 项目,所以假设我有一个数据结构:
我需要对此进行操作,通过确定当前时间(now())是否>最后一个+间隔(已经过去了 60 秒)?所以在代码中:
那有意义吗?我在任何地方都在使用 UTC,无论是存储的还是计算的……
此外,如果有人有关于如何在软件中使用时间戳的优秀文章的链接,我很乐意阅读它。可能像 Joel On Software 一样在应用程序中使用时间戳?
security - 等待处理的敏感瞬态数据的安全策略
我目前正在进行基于 REST API 的服务的 alpha 测试/开发,该服务代表其用户为客户端执行自动化任务。Web 应用程序托管在我的服务器上,任务由在后台服务中运行的工作人员处理。可能有许多服务实例跨多个服务器运行,具体取决于负载。
用户通过 API 创建会话,会话存储在数据库中并排队等待处理。然后用户为他们的会话发出命令。工作进程使会话出队并开始一一处理命令,直到用户关闭会话。命令结果存储在数据库中,供用户在完成后访问。
什么是确保命令输入在处理之前保持安全的好策略,因为它们可能包含不应泄露的敏感数据。处理后,可以删除输入,但我想向我的用户保证,我的系统处理的任何数据泄漏的可能性可以忽略不计。
python - Python 包设计和循环导入
我正在使用 Python 3.3.2 编写一个封装文件系统的包。我的项目如下所示:
与PYTHONPATH=~/python
.
问题是,file.py
需要directory.py
(例如, for File.get_directory()
)和directory.py
需要file.py
(例如, for Directory.get_files()
),所以我有一个循环导入。
- 当我使用
import directory
infile.py
和import file
in 时directory.py
,它仅在我的工作目录为filesystem
(即,当导入为本地时)时才有效。 - 当我使用
import filesystem.directory
infile.py
和import filesystem.file
in 时directory.py
,它工作得很好,除了写作filesystem.file.File
和filesystem.Directory.directory
所有时间的审美滋扰。 - 奇怪的是,当我使用
import filesystem.directory as directory
or时from filesystem.directory import Directory
,我得到了循环导入错误'module' object has no attribute 'directory'
。我的猜测是 whileimport ...
是懒惰的,import ... as
并from ... import
尝试评估模块并立即注意到循环性。 - 解决这个问题的一种方法是
import filesystem.directory
在使用它的函数内部。不幸的是,我的许多方法都使用它,并且在类中导入它似乎不起作用。
当然,这是可以解决的:吸收它并写作filesystem.directory.Directory
;在方法中分配__import__
一个全局变量以__init__
供所有其他方法使用;定义File
和Directory
在同一个文件中;等等。但这些妥协多于解决方案,所以我的问题仍然存在:
- 您将如何设计文件系统,其中文件类使用目录类,反之亦然?
- 更一般地说,您将如何处理(或避免)循环进口?
谢谢。
更新 [03.07.2013](主要是为了讨论)
我遇到的另一个解决方案是某种前向声明,在一个公共标头中包含空file
和directory
类,然后是单独的实现(更像是属性添加)。虽然最终的设计非常简洁,但这个想法比 Pythonic 更接近 C++。
transparency - 网络中的透明结构 - 正确的术语?
我正在开发一个地址系统,它提供了一种隐藏应用程序固定地址(例如 IP 绑定)的机制。例如,应用程序可能被称为APP1
. 如果此应用程序失败,此机制会默默地将备份实例的 IP 地址链接到抽象地址APP1
。然而,与之交谈的程序APP1
永远不会注意到这个隐藏的地址变化。
通常,人们将这种行为称为transparent
隐藏和使事物不可见的行为与使事物透明的相反。
是transparent
正确的术语吗?如果是,为什么?这个论点是否来自一些不同的视角?
为了防止关于这个问题的评论和标记成为主题:我正在编写一个技术规范,这是系统开发过程中非常重要的一步,因此需要与系统编程相同级别的准确性,因此只需将其视为一个编程问题在更广泛的意义上。
mysql - 以第三范式创建规范化数据库模式
我正在为我的大学二年级模型、系统分析和设计做一个小任务。我正在与一个应该很容易回答的问题作斗争,但我对自己的回答有一些疑问。
我将发布问题和我的答案。如果我的答案不正确,如果有人能抽出一点时间来查看它并把我推向正确的方向,我将不胜感激。
问题如下:
请参阅下页提供的可靠制药服务的 ERD,并在 3NF 中开发规范化的数据库模式。清楚地标明所有键。所有的表都应该是 3NF。在所有主键下划线,并用字母 FK 表示外键,例如…、Product-code (FK)、…。
请注意给定的 ERD
- 并非所有字段都给出
- 某些表可能不需要某些字段
- 不显示主键和外键
我的答案:
注意: 在我的回答中,主键位于表格的开头
在 OrderItem 表中,我遗漏了 PatientName、RoomNumber(因为它已经包含它,所以我这样做是否正确?)
同样在 OrderItem 表中,我省略了 ChemicalName、Manufactorer、UnitType、Dosage 和特殊说明,因为我觉得这是 OrderItem 表的不必要字段并且已经包含在其他表中,我这样做是否正确?
非常感谢您花时间阅读我的问题,也感谢这个精彩网站的创建者和贡献者
欢呼
c++ - C ++类函数返回值VS对本地数据进行操作?
假设我们有C类,我们的流程如下
- 做功能1
- 做功能2
- 做功能3
- 做func4
其中每个函数对前一阶段的数据进行操作
从系统设计的角度来看,哪个更好?
- 使每个函数接受一个输入,返回其结果并将结果传递给下一个阶段
- 使每个 func 对 c 类中的数据成员进行操作,并且它们都返回 void
如果这两种策略是著名的设计模式,那么每种设计模式的名称是什么?
simulation - 数字系统设计:模型模拟错误
我真的很不同,我需要你的帮助!首先,这是我在数字系统设计方面的第一门课程,我们被要求做一些项目,它是一个 ALU(算术逻辑单元),它执行多项操作,如加法、减法、递增、递减、2 的补码和一些逻辑门。 ..但是在完成所有工作并尝试模拟项目后,我将所有输出都设为“未知”..
这是 ALU 代码:
这是测试台:
知道可能是什么问题吗?
谢谢大家:)
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 实现最大吞吐量的最佳设计是什么?
还有其他更适合的框架吗?
欢迎任何想法和注意!
提前谢谢了!!!托比