草庐IT

mysql - 在 go 或 nodejs 中处理大量请求/秒

coder 2023-06-29 原文

我正在开发一个网络应用程序,需要处理突发的非常高的负载, 每分钟一次,我在几秒钟内收到大量请求(~1M-3M/秒),然后在剩下的一分钟内我什么也得不到,

在每个前端服务器上处理尽可能多的请求/秒的最佳策略是什么,只是发送回复并将请求以某种方式存储在内存中,以便稍后在后台由 DB writer worker 处理?

目的是在burst期间尽量少做,burst后尽快将请求写到DB。

编辑:交易顺序并不重要, 我们可能会丢失一些交易,但需要记录 99% 收到所有请求到数据库的延迟可能是在收到最后一个请求后的几秒钟。假设不超过 15 秒

最佳答案

这个问题有点含糊。但我会尝试一下。

1) 您需要限制。一个简单的实现将打开数百万个到数据库的连接,这显然会表现不佳。至少,每个连接都会占用数据库上 MB 的 RAM。即使使用连接池,每个“线程”也可能占用大量 RAM 来记录它的(传入)状态。

如果您的应用服务器的处理线程数量有限,您可以使用 HAProxy 来“拿起电话”并在队列中缓冲请求几秒钟,直到您的应用服务器上有空闲线程来处理请求。

事实上,您可以只使用像 nginx 这样的 Web 服务器来接收请求并说“200 OK”。然后,一个简单的应用程序读取网络日志并插入到数据库中。这将很好地扩展,尽管您可能希望一个线程读取日志并多个线程插入。

2) 如果您的语言有协程,您自己处理缓冲可能会更好。您应该衡量依赖我们的语言运行时进行调度的开销。

例如,如果每个 HTTP 请求都是 1K 的 header + 数据,想要解析它并丢弃除您实际需要的一两个数据(即 DB ID)之外的所有内容。如果您依赖语言协程作为“隐式”队列,则在解析每个协程时,它将为每个协程提供 1K 缓冲区。在某些情况下,拥有有限数量的工作人员并明确管理队列会更有效率/更快。当您有上百万件事情要做时,小开销会迅速累积起来,并且语言运行时不会始终针对您的应用程序进行优化。

此外,与 Node.js 相比,Go 可以更好地控制内存。 (结构比对象小得多。结构键的“开销”对于 Go 来说是编译时的事情,但对于 Node.js 来说是运行时的事情)

3) 你怎么知道它在工作? 你希望能够确切地知道你在做什么。当您依赖语言协同例程时,要问“我有多少个执行线程,最旧的是哪个?”并不容易。如果你做一个明确的队列,这些问题就更容易问了。 (想象一下几个 worker 把东西放进队列,然后几个 worker 把东西拉出来。边缘有一点不确定性,但中间的队列非常明确地捕获了你的积压。你可以很容易地计算出诸如“drain”之类的东西速率”和“最大内存使用量”,这对于了解您的重载程度非常重要。)

我的建议:使用 Go。从长远来看,Go 将是一个好得多的选择。 Go 运行时现在有点不成熟,但每个版本都在变得更好。 Node.js 可能在几个方面(成熟度、社区规模、库等)略微领先

关于mysql - 在 go 或 nodejs 中处理大量请求/秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20801537/

有关mysql - 在 go 或 nodejs 中处理大量请求/秒的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  5. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  6. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  7. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  8. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  9. ruby - 如何使用 Ruby HTTP::Net 处理 404 错误? - 2

    我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。

  10. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

随机推荐