- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为一个项目设计服务器守护程序,该项目必须处理大量并发请求并异步处理它们。我知道这样一个项目的规模很大,但是我对此很认真,并在进一步进行之前试图做出清晰的设计和计划。
这是我的目标清单:
可伸缩性-必须能够将架构并行化到多个处理器甚至多个服务器上。
能够应付大量并行连接。
如果单个请求需要很长时间才能处理,则决不能引起阻塞问题。
请求响应周转时间必须最短。
围绕.NET框架构建(将使用C#编写)
我提出的架构和流程相当复杂,因此以下是我的初始设计的图表:
(以及here it is on tinypic,以防其大小调整不正确)
这个想法是,请求是通过网络传入的(尽管我还没有决定TCP还是UDP是最好的),然后立即传递给高速负载均衡器。然后,负载均衡器使用加权随机数生成器选择一个请求队列(RQ)来放置请求。权重是从每个队列的大小得出的。使用加权RNG而不是仅将请求放入最不繁忙的队列中的原因是,它可以防止空的但阻塞的队列(由于挂起的请求)锁定整个服务器。如果所有RQ都超过一定大小,则负载平衡器将丢弃请求,并将“服务器太忙”响应放入输出队列(OPQ)-此部分未在图中显示。
每个队列对应一个线程,该线程的相似性设置为服务器上的一个CPU内核。这些线程是并行请求处理器的一部分,并行处理器处理来自每个队列的请求。这些请求分为以下三种类型之一:
立即-顾名思义,立即处理立即请求。
可延迟-可延迟请求被认为是低优先级。在低负载期间将立即对其进行处理,如果负载较高,则将它们放入延迟请求队列(DRQ)中。负载平衡器从DRQ中提取这些延迟的请求,将它们标记为立即请求,然后将它们放回适当的RQ中。
定时-定时请求连同其目标时间戳一起放入定时请求队列(TRQ)。这些请求通常是另一个请求的结果,而不是由客户端显式发送的。当超过请求时间戳时,下一个可用的请求处理器线程将使用它并对其进行处理。
处理请求时,可以从内存中的键/值对缓存,键/值对缓存或磁盘上或从专用SQL数据库服务器中获取数据。缓存的值将是BSON,索引将是一个字符串。我正在考虑使用Dictionary<T1,T2>
在内存中实现此功能,并为磁盘缓存使用btree(或类似功能)。
处理完成后创建响应,并将其放入输出队列(OPQ)中。然后,循环将消耗来自OPQ的响应,并将其通过网络发送回客户端。如果OPQ达到其最大大小的80%,则将暂停四分之一的请求处理器线程。如果OPQ达到其最大大小的90%,则将暂停一半的请求处理器线程。如果OPQ达到其最大大小,则所有请求处理器线程都将暂停。这将通过信号量来实现,该信号量还应防止单个请求处理器线程被阻塞并留下陈旧的请求。
我在寻找一些方面的建议:
我错过了此体系结构的主要缺陷吗?
出于性能原因,我是否应该考虑更改任何内容?
TCP或UDP更适合请求吗?拥有TCP提供的“交付证明”将非常有用,但是UDP的轻量级特性也很有吸引力。
在Windows Server上处理100k +并发连接时,是否需要考虑一些特殊的考虑?我知道Linux的TCP堆栈处理得很好,但是我不太确定Windows的情况。
我还有其他问题要问吗?我忘了考虑什么吗?
我知道要阅读的内容很多,可能要问的也很多,所以感谢您的宝贵时间。
图here的更新版本。
最佳答案
您也可以考虑以下几点:
故障转移。您可以设计一种在可能的服务崩溃时持久保留请求的方法,以便即使在服务重启后,所有待处理的请求也将得到处理
错误队列。 (也称为Dead Letter Channel模式)
Pipes and Filters。通过提供这样的功能,您将获得服务的高度灵活性和可扩展性
请求确认。在某个预定义的时间间隔中,客户端向服务发送了一个请求,等待将CorrelationId设置为初始RequestId的Ack消息,这样,如果客户端未收到特定请求,则服务可以通知客户端已接收到特定请求并将其放入入站队列中。接收刚刚发送的请求的确认-它可以重新发送该请求或将其标记为失败。
PS:我也建议伟大的书“ Enterprise Integration Patterns”
关于.net - 处理服务中传入请求的体系结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8002442/
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我遇到了这两个文档(它们是用意大利语写的,尽管代码注释是英文的): http://home.deib.polimi.it/brandole/acsocr/L13%20-%20Generic%20Ass
我的主要目标是提供一个用 jquery 编写的基于 solr 的搜索应用程序。 (不熟悉solr的,就假设它是一个可以返回搜索结果的rest api。)为了这个目标,我编写了许多小型应用程序和 ser
这个问题是关于选择“正确”类型的NoSQL数据库的,我希望甚至可以根据我将在下面列出的一些需求/用例以及当前正在使用的传统RDBMS解决方案,讨论特定的数据库以及它们为什么适用。地点。时间长了一点,但
在 Java 中我运行: System.out.println(Math.log(249.0/251.0)); Output: -0.008000042667076265 在 C# 中我运行:<- 已
我目前正在考虑通过 Redux 将 Context 实现到我们的一个应用程序中,但是,我似乎找不到任何关于什么是大型应用程序的最佳结构的信息? Redux 有一个定义的方法来创建 reducer、ac
我正在使用 mailcore 框架,但收到错误消息“archtecture x86 的重复符号”以及“找不到选项的目录” 下面是错误日志。 Ld /Users/user/Library/Develop
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 11 个月前关闭。 Improve t
假设我正在从 C++ 移植代码并需要在 C# 中模拟相同的位移技术: 每当我执行位移时,我是否必须考虑架构的 Endain-ness? 最佳答案 没有。位移是一种纯粹的代数运算。它不比乘以二更依赖于平
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
关于架构 XXX 的重复符号有很多问题,但我没有得到我的问题的答案。在我的场景中,我使用 Cocoapod,并导入 FMDB,但是当我集成另一个第三方 SDK 时,当我构建项目时,出现如下错误: 是否
我无法编译我的 Xcode 项目,它有重复的 ParseFacebookUtilsV4 问题 这是我的苹果 Mach-O 链接器错误: duplicate symbol _llvm.cmdline i
我对使用 MFC 的内置文档 View 体系结构的必要性有疑问。我得到了一个基于对话框的旧项目,我必须在其中用框架替换主对话框并添加功能区。它有一种文档 View 架构,创建时没有内置类,我更愿意在新
我正在构建一个协作创作工具,该工具允许用户共同编辑信息空间,该信息空间是节点和链接的可视化。一个客户端应用程序中所做的更改需要反映到所有其他客户端中。由于它是可视化的,因此可能需要经常更新潜在的大数据
如果我在 Windows(x86 和 x64)下的 .NET 上运行涉及 System.Double 的复杂计算,然后在 Mono(Linux、Unix 等)上运行,绝对有保证 以在所有情况下得到完全
当我使用 Xcode 4.6 编译我的 iPhone 应用程序时,我看到一个奇怪的错误代码: "duplicate symbols for architecture i386". 我知道这个关于文件名
我最近询问了 System.Double,并被告知计算可能因平台/架构而异。不幸的是,我找不到任何信息来告诉我这是否适用于 System.Decimal。 对于任何特定的 decimal 计算,无论平
我有一些实体,例如:Customers、Orders、Invoices。 对于它们中的每一个,我都将它们的CRUD 操作 和一些其他界面分组为:ISvcCustomerMgmt、ISvcOrderMg
这个问题有点像一个池。我们正在尝试在使用 LINQ to SQL 之类的 ORM 时确定最佳架构。我们正在定义的架构是用于其他应用程序将通过直接引用 DLL 或通过 Web 服务访问的框架。我们有 .
请就如何为 Java web 应用程序做“插件”架构提出建议。 目前我们在 Tomcat servlet 容器中使用非常简单和标准的 Spring+Hibernate+Struts 2。 (使用 ma
我是一名优秀的程序员,十分优秀!