Questions tagged «architecture»

软件系统的高级设计和描述。架构设计提取了实现,算法和数据表示的细节,以专注于“黑匣子”组件的交互。

11
设计寿命超过40年的Web应用程序的建议
情境 目前,我是一个医疗保健项目的一部分,其主要要求是使用医疗保健提供者使用用户生成的表单来捕获属性未知的数据。第二个要求是数据完整性是关键,并且该应用程序将使用40年以上。我们目前正在将过去40年的客户数据从各种来源(纸张,Excel,Access等)迁移到数据库。将来的要求是: 表单的工作流程管理 表格进度管理 基于安全/角色的管理 报告引擎 手机/平板电脑支持 情况 在短短6个月的时间里,当前的(合同制)架构师/高级程序员采用了“快速”方法,并设计了一个较差的系统。由于他已经设计了一些bean来对数据库执行“删除”操作,所以数据库未规范化,代码已耦合,层没有专用目的,并且数据开始丢失。代码库极度膨胀,并且由于数据库未标准化,因此有些作业只是为了同步数据。他的方法一直是依靠备份作业来还原丢失的数据,并且似乎不相信重构。 将我的发现提交给项目经理之后,建筑师的合同结束后将被撤职。我已经获得了重新架构此应用程序的任务。我的团队由我和一名初级程序员组成。我们没有其他资源。我们已经获得了为期6个月的冻结要求,在此期间我们可以专注于重新构建该系统。 我建议使用像Drupal这样的CMS系统,但是由于客户组织的政策原因,该系统必须从头开始构建。 这是我第一次设计使用寿命超过40岁的系统。我只从事3-5年使用寿命的项目,所以这种情况非常新,但令人兴奋。 问题 哪些设计考虑因素将使系统更“面向未来”? 应该向客户/ PM问什么问题,以使系统更“面向未来”?

7
微服务系统架构如何避免网络瓶颈?
我已经阅读了很多有关服务器应用程序的微服务架构的信息,并且一直想知道与整体式架构相比,内部网络的使用是不是瓶颈或明显的劣势。 为了精确起见,以下是我对这两个术语的解释: Monolith体系结构:一个用一种语言处理所有功能,数据等的应用程序。负载平衡器将最终用户的请求分布在多台计算机上,每台计算机都运行我们应用程序的一个实例。 微服务体系结构:许多应用程序(微服务)处理一小部分功能和数据。每个微服务都公开通过网络访问的公共API(与同一机器上的进程间通信或共享内存相反)。API调用主要在服务器上进行搜索以生成页面,尽管其中一些工作可能是由客户端查询各个微服务来完成的。 用我天真的想象力,似乎微服务体系结构使用的网络通信速度较慢,而不是同一台计算机(内存和磁盘)上的资源更快。如何确保通过内部网络进行API查询不会减慢整体响应时间?

12
“一切都是地图”,我这样做对吗?
在我制作的这款游戏中,我观看了Stuart Sierra的演讲“ 数据中的思考 ”,并将其中的一种想法作为设计原则。不同之处在于他在Clojure中工作,而我在JavaScript中工作。我发现我们的语言之间存在一些主要差异: Clojure是惯用的函数式编程 大多数状态是不可变的 我从幻灯片“一切都是地图”中汲取了灵感(从11分钟6秒到> 29分钟)。他说的一些话是: 每当您看到一个带有2-3个参数的函数时,就可以将其变成一个映射并仅将一个映射传入。这有很多优点: 您不必担心参数顺序 您不必担心任何其他信息。如果有多余的键,那不是我们真正关心的。它们只是流过而不会干扰。 您不必定义架构 与传递对象相反,没有数据隐藏。但是,他认为数据隐藏可能会导致问题并被高估: 性能 易于实施 通过网络或跨流程进行通信后,无论如何,都必须让双方都同意数据表示。如果仅处理数据,则可以跳过这额外的工作。 与我的问题最相关。这是29分钟的时间: “使您的功能可组合”。这是他用来解释概念的代码示例: ;; Bad (defn complex-process [] (let [a (get-component @global-state) b (subprocess-one a) c (subprocess-two a b) d (subprocess-three a b c)] (reset! global-state d))) ;; Good (defn complex-process [state] (-> state subprocess-one …

7
建立服务层有多重要?
我开始按3层(DAL,BL,UI)构建应用程序[它主要处理CRM,一些销售报告和库存]。 一位同事告诉我,我必须转向服务层模式,开发人员应从他们的经验中学到服务模式,这是设计大多数应用程序的更好方法。他说,将来以这种方式维护应用程序会容易得多。 就个人而言,我觉得它只是使事情变得更加复杂,我看不出有什么好处可以证明这一点。 这个应用程序确实有一个额外的小部分ui,它使用了一些(但只有少数)桌面应用程序功能,因此我确实发现自己在复制一些代码(但不很多)。仅仅由于某些代码重复,我不会将其转换为面向服务的,但是他说我还是应该使用它,因为总的来说,这是一个非常好的架构,为什么程序员如此热衷于服务? 我试图用谷歌搜索它,但是我仍然很困惑,无法决定该怎么做。

9
存储库应该返回IQueryable吗?
我已经看到很多项目的存储库返回的实例IQueryable。这允许其他过滤器,并且可以IQueryable通过其他代码对进行排序,从而转换为正在生成的不同SQL。我很好奇这种模式的来源以及它是否是一个好主意。 我最大的担心是,一个IQueryable被枚举的承诺会在一段时间后打入数据库。这意味着将向存储库外部抛出错误。这可能意味着在应用程序的不同层中引发了Entity Framework异常。 过去,我也遇到过多个活动结果集(MARS)的问题(尤其是在使用事务时),这种方法听起来更容易导致这种情况的发生。 我总是在每个LINQ表达式的末尾调用AsEnumerable或ToArray,以确保在离开存储库代码之前已命中数据库。 我想知道返回IQueryable是否可用作数据层的构建块。我已经看到一些相当奢侈的代码,其中一个存储库调用另一个存储库以构建更大的代码IQueryable。

13
为什么“较低”的应用程序层不了解“较高”的层是一个好主意?
在典型的(设计良好的)MVC Web应用程序中,数据库不知道模型代码,模型代码不知道控制器代码,并且控制器代码不知道视图代码。(我想您甚至可以从硬件开始甚至更远的地方开始,而且模式可能相同。) 换个方向,您只能向下移动一层。视图可以知道控制器,但不能知道模型。控制器可以知道模型,但不能知道数据库;该模型可以识别数据库,但不能识别操作系统。(更深层次的内容可能无关紧要。) 我可以直观地理解为什么这是一个好主意,但我无法明确表达。为什么这种单向分层样式是个好主意?

5
从另一个微服务“拥有”的数据库中读取数据为何如此糟糕
我最近阅读了有关微服务体系结构的出色文章:http : //www.infoq.com/articles/microservices-intro 它指出,当您在Amazon上加载网页时,则有100多个微服务合作提供该页面。 该文章描述了微服务之间的所有通信只能通过API。我的问题是,为什么这么糟糕的说法是所有数据库写操作只能通过API进行,但是您可以自由地直接从各种微服务的数据库中进行读取。例如,可以说微服务外部只能访问少数几个数据库视图,以便维护微服务的团队知道只要保持这些视图不变,那么他们就可以尽可能多地更改其微服务的数据库结构。想。 我在这里想念什么吗?还有其他原因为什么只能通过API读取数据? 不用说,我的公司要比亚马逊小得多(并且一直会这样),我们可以拥有的最大用户数约为500万。

19
处理可怕的估计
我最近从事的一个项目被建筑师严重低估了。估计至少超出了500%。 不幸的是,在与客户签署估算之后,我才被带入该项目。作为高级开发人员,我很快意识到了功能和技术规范。包含一些巨大的差距和不确定性。 结果,我感到不得不与业务和技术主管召开紧急会议,让他们了解现实。作为开发人员的首要任务,我发现这是一个非常压力和困难的情况。“企业”指责IT不称职,是我收到的一些“子弹”使者。 客户威胁要取消该帐户,但是迄今为止该项目仍未完成,我不再直接参与其中。 这位建筑师在社交上是一个好人,但基于这一事件,他要么完全无能,要么存在巨大的销售/业务压力,影响了他的估算。 因此,作为程序员,您对这种情况有何经验?您会如何建议处理这种情况?

15
有什么理由不直接从客户端Javascript转到数据库吗?
可能重复: 编写Web“服务器少”应用程序 因此,假设我要构建一个Stack Exchange克隆,然后决定使用CouchDB之类的东西作为我的后端存储。如果我使用它们的内置身份验证和数据库级别授权,是否有任何理由不允许客户端Javascript直接写入可公开使用的CouchDB服务器?因为这基本上是一个CRUD应用程序,并且业务逻辑由“只有作者才能编辑他们的帖子”组成,所以我认为在客户端内容和数据库之间没有一层的必要性很高。我只是在CouchDB端使用验证,以确保没有人放入垃圾数据,并确保正确设置权限,以便用户只能读取自己的_user数据。渲染将通过类似于AngularJS的客户端完成。从本质上讲,您可能只拥有一个CouchDB服务器和一堆“静态”页面,因此一切顺利。您不需要任何类型的服务器端处理,而只需要一些可以处理HTML页面的内容即可。 向世界开放我的数据库似乎是错误的,但是在这种情况下,只要正确设置权限,我就无法想到为什么。这违背了我作为Web开发人员的本能,但我想不出一个很好的理由。那么,为什么这是个坏主意呢? 编辑:看起来这里有一个类似的讨论:编写Web“服务器少”应用程序 编辑:到目前为止,很棒的讨论,我感谢大家的反馈!我觉得我应该添加一些通用假设,而不是专门调用CouchDB和AngularJS。因此,我们假设: 数据库可以直接从其隐藏存储对用户进行身份验证 所有数据库通信都将通过SSL进行 数据验证可以(但不应这样做)由数据库处理 除了管理员功能外,我们关心的唯一授权是仅允许某人编辑自己的帖子 每个人都可以读取所有数据(除了可能包含密码哈希的用户记录之外),我们非常满意 管理功能将受到数据库授权的限制 没有人可以将自己添加为管理员角色 数据库相对容易扩展 真正的商业逻辑几乎没有,甚至没有。这是一个基本的CRUD应用

5
不同微服务之间的共享域模型
想象一下两种不同的微服务的场景。一个负责处理服务中的身份验证,另一个负责用户管理。他们都有用户的概念,并且会通过相互调用来谈论用户。 但是,“用户”的域模型将属于哪里?它们在数据库级别上对用户的身份都有不同的表示吗?当我们有一个UserDTO可以用于API调用时,它们各自的API是否都有一个呢? 对于这种架构问题,公认的解决方案是什么?

18
处理别人的代码[关闭]
我几乎没有一年的编码经验。开始工作后,大多数时候我都会处理别人的代码,或者在现有功能上添加新功能,或者修改现有功能。编写实际代码的人在我公司不再工作。我很难理解他的代码并完成任务。每当我尝试修改代码时,我都会以某种方式弄乱正常工作的功能。在处理别人的代码时,我应该牢记什么?

3
如何在敏捷环境中完成建筑设计?
我已阅读《敏捷架构师原则》,其中定义了以下原则: 原则1:对系统进行编码的团队设计系统。 原则2构建最简单的可行架构。 原则#3如有疑问,请将其编码。 原则4:他们构建,测试。 原则5:系统越大,跑道越长。 原则6系统架构是角色协作。 原则7:创新没有垄断。 该论文说,大多数架构设计是在编码阶段完成的,而在此之前只有系统设计。那也行。 那么,系统设计如何完成?使用UML?还是定义接口和主要块的文档?也许还有别的吗?

6
如何应对依赖依赖的恐惧
我所在的团队创建了可供公司合作伙伴用来与我们的平台集成的组件。 因此,我同意在引入(第三方)依赖项时应格外小心。当前,我们没有第三方依赖项,我们必须保持框架的最低API级别。 一些例子: 我们被迫停留在框架的最低API级别(.NET标准)上。其背后的原因是,有一天可能会出现一个仅支持非常低的API级别的新平台。 我们已经实现了自己的用于(反)序列化JSON的组件,并且正在对JWT进行同样的处理。在更高级别的框架API上可用。 我们已经围绕标准库的HTTP框架实现了包装器,因为我们不想依赖于标准库的HTTP实现。 同样,出于同样的原因,所有用于映射到XML或从XML映射的代码都是“手工”编写的。 我觉得我们走得太远了。我想知道如何处理这个问题,因为这会极大影响我们的速度。

13
如何停止浪费时间设计建筑[关闭]
我最近刚从大学毕业,开始从事程序员工作。我发现解决“技术”问题或用我说有1个解决方案的东西进行调试并不困难。 但是似乎有一类问题没有一个明显的解决方案,例如软件体系结构。这些事情使我困惑,使我感到极大的困扰。 我花了数小时的时间来尝试确定如何“架构”我的程序和系统。例如-我是否将此逻辑划分为1或2个类,如何命名这些类,是否应该将其设为私有或公开类,等等。这些问题占用了我很多时间,这使我感到非常沮丧。我只想创建程序-该死的体系结构。 我如何才能更快地完成架构阶段并进入自己喜欢的编码和调试阶段?

12
如何退后一步,以崭新的眼光看代码?[关闭]
去年,我以一个人的团队工作,开发了一个富客户端应用程序(价值35,000多个LoC)。目前处于稳定状态并已投入生产。但是,我知道我的技能在项目开始之初就生锈了,因此毫无疑问,代码中存在重大问题。在这一点上,大多数问题都在架构,结构和交互方面-容易的问题,甚至是架构/设计问题,已经被淘汰。 不幸的是,我在这个项目上花费了很多时间,以至于我难以思考它之外的问题-从一个新的角度来处理它,以查看深层掩盖或固有于设计中的缺陷。 我该如何超越自己的头脑和代码范围,以使外观焕然一新并变得更好?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.