我已经使用PHP多年,并且非常好地掌握了语言,创建了许多先进且不那么先进的系统,这些系统运行良好.
我遇到的问题是,当我发现需要以前没有学到的东西时,我才会学习.这使我查找处理问题的解决方案和其他代码,因此我将学习一个我以前从未见过的新功能或结构.通过这种方式,我学到了许多更好的技巧(例如学习亚马逊,谷歌或其他大公司推出的课程).
这个问题的主要问题是如果你不知道它存在的话就无法学到东西的概念.例如,我花了几个月的时间来学习empty()
函数,我只是检查字符串长度strlen()
来检查空值.
我现在正在构建越来越大的系统,我开始阅读像highscalability.com这样的博客,并一直在研究MySQL复制和服务器数据以进行扩展.我知道代码结构对于使完整系统工作非常重要.
在阅读了最近关于reddit结构的博客后,它让我怀疑是否有一些标准或"接受的系统".
我已经研究过框架(我使用了Kohana,我后悔了,但我认为PHP框架不适合我)而且我更喜欢自己的函数库而不是框架.
我目前的结构是WordPress,Kohana和我自己的知识之间的混合.
我认为可能有益的方法是:
作为一个非常优秀的系统开发人员,"达到更高水平"的最佳方式是什么?
拥有Java/C++的强大背景我想知道是否有可能开发一个更大的JavaScript应用程序而不必削减质量.
任何提示都受到赞赏:
我也很好奇JavaScript PC模拟器和JavaScript游戏引擎等项目是如何处理这些问题的,以防有些人知道.
我一直致力于移动技术,现在我正在涉足后端系统,更具体地说是系统设计。我不断遇到关于 api 网关和负载均衡器角色的相互矛盾的陈述。谷歌搜索只返回了同样的六个结果,这些结果主要集中在一些著名服务提供的负载均衡器或 API 网关服务的实现上。我将在这里列出我面临的所有困惑,希望有人能够澄清所有这些。
有时,我发现 API 网关是与客户端设备通信的单点。另一方面,有些地方提到“请求发送到负载均衡器,负载均衡器将其均匀地分布在服务器上”。那么什么是正确的呢?API网关接收请求还是负载均衡器?
其他地方,当我用谷歌搜索这个主题时,说两者完全不同。我知道 API Gateway 可以做很多事情,比如 SSL 终止、日志记录、限制、验证等,但它也可以做负载平衡。那么API网关本身就是一个负载均衡器,还具备其他职责吗?
关于这个主题,我想了解负载均衡器是否在同一集群的服务器之间或不同的数据中心或集群之间分配负载?那么 API 网关呢?
api gateway 有什么特殊之处以至于它成为微服务架构的默认选择?API 网关托管在哪里?DNS 将域名解析为负载均衡器或 API 网关?
可能很清楚,我完全困惑了。如果问题正确的话,在哪些系统中负载均衡器比 API Gateway 受益更多。
dns load-balancing distributed-system system-design api-gateway
系统设计问题是科技公司在访谈中倾向于询问的一类问题,以及更常见的基于algorythmic和知识的问题.该术语涵盖了抽象的面向对象设计
勾勒出垄断游戏的类图
还有更多关于以性能为导向的问题
您如何为大型Facebook游戏设计事件记录系统?
现在越来越多的这些问题涉及并发和分布式计算的主题.这些类型问题的问题是 - 很难找到好的资源.与algorthmic问题不同,没有在线评委会立即告诉您是否做得对.在像careercup这样的网站上发布的问题没有回答或不可靠.涉及系统设计的书籍范围太宽,无法用于面试准备.那么:你如何准备系统设计问题,而不是设计系统几年?有在线教程吗?问题 - 答案(解释) - 类型指南?
我真的很好奇
如何编写谷歌文档等协作工具?
我能想到的最接近的事情是编写一个像聊天这样的消息传递系统,然后来回发送消息,以便每个客户端自我更新.
你知道他们编写像这样的小工具的教程/演示吗?
他们使用什么工具来做这种应用?
TIA可以提供任何指示.
当前选择: lua-jit.令人印象深刻的基准测试,我已经习惯了语法.编写高性能ABI需要仔细考虑如何构建我的C++.
其他感兴趣的问题
背景
我正在研究一个实时高容量(复杂)事件处理系统.我有一个DSL,代表源的事件结构的模式,存储格式,某些特定于域的构造,触发内部事件(构造和驱动通用处理),以及编码始终发生的某些处理步骤.
DSL看起来非常类似于SQL,事实上我使用berkeley db(通过sqlite3接口)来长期存储事件.这里的重要部分是事件处理是基于集合完成的,就像SQL一样.然而,我得出结论,我不应该在DSL中添加通用处理逻辑,而是嵌入lua或lisp来处理这个问题.
处理核心是arround boost :: asio,它是多线程的,rpc是通过协议缓冲区完成的,事件是使用协议缓冲区IO库编码的 - 事件不是使用协议缓冲区对象构建的,它们只使用相同的编码/解码库.我将创建一个包含行的数据集对象,与数据库引擎在内存集中的存储方式非常相似.首先处理DSL中的处理步骤,然后将其呈现给通用处理逻辑.
无论我使用哪种可嵌入的脚本环境,我的处理核心中的每个线程都可能需要它自己的嵌入式语言环境(这就是lua至少在你做多线程工作时需要它的方式).
问题
目前的选择是在lisp ECL和lua之间.请记住,性能和吞吐量是一个强烈要求,这意味着非常需要最小化内存分配:
如果你在我的位置,你会选择哪种语言?
有没有我应该考虑的替代方案(不建议没有可嵌入实现的语言).Javascript v8也许吧?
lisp更适合这个领域吗?我不认为lua和lisp在它们提供的方面有所不同.叫我出去:D
我应该考虑其他任何属性(如下所示)吗?
我断言任何形式的嵌入式数据库IO(请参阅下面的示例DSL以获取上下文)使脚本语言调用在数量级上相形见绌,并且选择这两者不会给总体吞吐量增加太多开销.我是在正确的轨道上吗?:d
期望的属性
我想将我的数据集映射到lisp列表或lua表,我想最小化冗余数据副本.例如,如果两个表具有相同的形状,则从一个数据集向另一个数据集添加行应尝试使用引用语义.
我可以保证在我进行lua/lisp调用时,作为输入传递的数据集不会改变.我希望lua和lisp在可能的情况下强制不改变数据集.
在嵌入式调用结束后,应该销毁数据集,创建的任何引用都需要用副本替换(我猜).
DSL示例
我附上了一个DSL供您观看,这样您就可以了解我想要实现的目标.注意:DSL不显示通用处理.
// Derived Events : NewSession EndSession
NAMESPACE WebEvents
{
SYMBOLTABLE DomainName(TEXT) AS INT4;
SYMBOLTABLE STPageHitId(GUID) AS INT8;
SYMBOLTABLE UrlPair(TEXT hostname ,TEXT scriptname) AS INT4;
SYMBOLTABLE UserAgent(TEXT UserAgent) AS INT4;
EVENT 3:PageInput
{
//------------------------------------------------------------//
REQUIRED 1:PagehitId GUID
REQUIRED 2:Attribute TEXT;
REQUIRED 3:Value TEXT;
FABRRICATED 4:PagehitIdSymbol INT8;
//------------------------------------------------------------// …
Run Code Online (Sandbox Code Playgroud) 在Swift中,我历史上使用扩展来扩展封闭类型并提供方便的,无逻辑的功能,如动画,数学扩展等.但是,由于扩展是硬依赖性遍布整个代码库,我总是在实现之前三次思考某事作为延伸.
最近,我已经看到Apple建议在更大程度上使用扩展,例如将协议实现为单独的扩展.
也就是说,如果你有一个实现协议B的A类,你最终会得到这样的设计:
class A {
// Initializers, stored properties etc.
}
extension A: B {
// Protocol implementation
}
Run Code Online (Sandbox Code Playgroud)
当你进入那个兔子洞时,我开始看到更多基于扩展的代码,例如:
fileprivate extension A {
// Private, calculated properties
}
fileprivate extension A {
// Private functions
}
Run Code Online (Sandbox Code Playgroud)
我的一部分就像你在单独的扩展中实现协议时获得的构建块.它使得该类的独立部分非常独特.但是,只要继承此类,就必须更改此设计,因为无法覆盖扩展函数.
我认为第二种方法是......有趣.一旦它成功,那就是你不需要注释每个私有属性并将其作为私有属性,因为你可以为扩展指定.
但是,这种设计还会分割存储和非存储的属性,公共和私有函数,使类的"逻辑"更难遵循(我知道写较小的类).这与子类化问题一起使我在延伸仙境的门廊上停了下来.
很想听听Swift社区如何看待扩展.你怎么看?有一个银色的小礼物吗?
我刚开始学习负载均衡器。以服务器端应用程序(http/https)负载均衡器为例,我假设它侦听特定的 ip 地址,然后根据其算法将 http 请求转发到可用服务器。
那么负载均衡器有没有可能成为瓶颈呢?因为它正在侦听特定的 ip 地址,所以所有请求将首先转到单个负载均衡器。所以我认为可能存在流量超出负载均衡器的限制/容量的情况。
当它成为瓶颈时,我们能做什么?我们可以使用多个负载均衡器吗?
我认为一种可能的解决方案是使用多个负载均衡器并将所有 ip 公开给客户端。(这听起来像客户端负载均衡)所以当客户端想要发送请求时,它可以从 ip 池中选择,然后将请求发送到负载均衡器之一。(例如,可以在此处使用 ZooKeeper。)这是一个有效的解决方案吗?还有其他方法可以使用多个负载均衡器吗?
谢谢。伊森
我正在尝试设计一个通用的作业调度程序,以扩展我的架构知识和在面试中思考系统设计问题的能力.到目前为止,我想出的是下面的内容.你能指出我应该在哪些方面努力做到全面解决这类问题吗?
我在线阅读了大量资源,但需要一些具体的指导才能继续前进.
为X公司设计通用的作业调度程序(这是当今的大型技术公司之一).
用例
创建/读取/更新/删除作业
调查过去运行的工作(工作类型,花费的时间,详细信息)
约束
每秒在系统上运行多少个作业?
=#jobs /小时由于用户+#jobs /小时由于机器
= 1m*0.5 /天/ 24/3600 + 1m/50*20/24/3600
〜= 12个工作/秒
系统需要存储多少数据?
推理:我只存储作业执行细节,在其他机器上完成实际工作(脚本执行),收集的一些数据是结束时间,成功/失败状态等.这些都可能只是文本,也可能是图形用于说明目的.我将通过作业调度程序(即过去10年)存储>>在系统中执行的所有作业的数据
=(设置作业详细信息的页面大小+收集的有关作业的数据大小)*作业数量*365>天*10年= 1 MB*900 000*365*10
〜= 3600 000 000 MB
= 3600 000 GB
= 3600 TB = 3.6 PB
抽象设计
根据上述信息,我们不需要太多的机器来保存数据.我会将设计分解为以下内容:
应用层:提供请求,显示UI详细信息.
数据存储层:类似于大型哈希表:存储键值的映射(键是由运行的dateTime组织的作业,而值将显示这些作业的详细信息).这样可以轻松搜索历史和/或预定作业.
瓶颈:
流量:12个工作/秒不是太具有挑战性.如果出现这种情况,我们可以使用负载均衡器将作业分发到不同的服务器以便执行.
数据:在3.6 TB时,我们需要一个可以轻松查询的哈希表,以便快速访问已在应用程序中执行的作业.
缩放抽象设计
这个作业调度程序的本质是它每个作业都拥有以下几个状态之一:Pending,Failed,Success,Terminated.没有业务逻辑返回很少的数据.
为了处理流量,我们可以拥有一个处理12个请求/秒的应用服务器和一个备份,以防这个失败.将来,我们可以使用负载均衡器来减少发送到每个服务器的请求数量(假设> 1台服务器正在生产中)这样做的好处是减少请求/服务器数量,增加可用性(如果一台服务器出现故障,以及处理spike-y交通井).
对于数据存储,要存储3.6 TB的数据,我们需要一些机器将其保存在数据库中.我们可以使用noSQL db或SQL db.鉴于后者有更广泛的使用和社区支持,这将有助于解决问题,目前被大公司使用,我会选择mySQL数据库.
随着数据的增长,我将采用以下策略来处理它:
1)在哈希上创建唯一索引
2)通过添加更多内存来垂直扩展mySQL数据库
3)通过分片对数据进行分区
4)使用具有主 - 主复制的主从复制策略来确保数据冗余
结论
因此,这将是我对作业调度程序组件的设计.
architecture n-tier-architecture job-scheduling system-design
我是CQRS/ES世界的新手,我有一个问题.我正在开发一个使用事件采购和CQRS的发票Web应用程序.
我的问题是 - 根据我的理解,进入系统的新命令(比方说ChangeLineItemPrice)应该通过域模型,以便可以将其验证为合法命令(例如,检查此行项目是否实际存在,价格不违反任何商业规则等).如果一切顺利(命令未被拒绝) - 则会创建并存储相应的事件(例如LineItemPriceChanged)
我没有得到的是在尝试应用命令之前如何将此聚合保留在内存中.如果我在系统中有一百万张发票,每次我想申请一个命令时,我应该播放整个历史记录吗?我是否总是在没有任何验证的情况下保存事件,并在构建视图模型/投影时进行验证?
如果我误解了过程的任何部分,我将非常感谢您的反馈.
谢谢你的帮助!
system-design ×10
architecture ×2
api-gateway ×1
c++ ×1
cqrs ×1
dns ×1
ide ×1
ios ×1
javascript ×1
lisp ×1
lua ×1
php ×1
real-time ×1
structure ×1
swift ×1
unit-testing ×1