热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从数百万个光纤(而不是数千个线程)中查询数据库

jOOQ是在Java中执行SQL的好方法,Quasar光纤带来了大大提高的并发性我们很高兴在平行宇宙的FabioTudone的jOOQ博客上宣布另一个非常有趣的来宾帖

jOOQ是在Java中执行SQL的好方法, Quasar光纤带来了大大提高的并发性

我们很高兴在平行宇宙的 Fabio Tudone的jOOQ博客上宣布另一个非常有趣的来宾帖子。

Parallel Universe开发了一个开源堆栈,使开发人员可以轻松地在JVM上对极端的并发应用程序进行编码。 使用Parallel Universe堆栈,您可以构建与现代硬件协调工作的软件,而不是动every动脑,同时保持您的编程语言和简单,熟悉的编程风格。

法比妥酮 Fabio Tudone作为Comsat项目的一部分,开发和维护Quasar集成模块。 在加入Parallel Universe团队之前,他曾参与并领导了基于云的企业内容治理平台的开发工作数年,并且他在整个职业生涯中一直在编写JVM软件。 他的兴趣包括Dev和DevOps实践,可伸缩性,并发和功能编程以及运行时平台。 他自然好奇,喜欢探索,他喜欢从人,地方和文化中收集知识和理解。 他还对意识实践感兴趣,喜欢写各种各样的东西。

Quasar作为Comsat项目的一部分,具有JDBC和jOOQ的集成,因此让我们来看看它的内部。

JDBC,jOOQ和Quasar

comsat-jdbc提供了JDBC API的光纤阻塞包装程序,因此您可以在光纤而不是常规Java线程中使用连接。

为什么要这么做? 因为光纤是轻量级线程,并且与正在运行的JVM中的线程相比 ,您可以拥有更多的光纤。 “更多”意味着我们要说的是数百万人,而不是数千人。

这意味着在等待JDBC执行时,您的系统中有更多的并行能力来并行执行其他操作,无论是并发/并行计算(例如在高度可靠的类Quasar Erlang类actor系统中 交换actor消息 )阻止I / O(例如, 服务 Web 请求 , 调用微服务 ,通过光纤NIO读取文件或访问其他启用了光纤的数据源(如MongoDB ))。

如果您的数据库能忍受它,而更多的常规线程不会使您的系统崩溃(甚至),您甚至可以增加光纤JDBC池(请参阅附加点:后面的等待线 )并发送更多并发的jOOQ命令。

由于jOOQ使用JDBC连接访问数据库,因此在光纤上运行jOOQ就像引入comsat-jooq依赖项并将启用光纤的JDBC连接传递到jOOQ上下文一样简单:

import java.sql.Connection;
import static org.jooq.impl.DSL.*;// ...Connecton conn = FiberDataSource.wrap(dataSource).getConnection();
DSLContext create = DSL.using(connection);// ...

当然,您也可以将ConnectionProvider配置为从FiberDataSource提取连接。

从这一刻起,您可以使用常规的jOOQ,所有操作都将在光纤阻塞模式下发生,而不是在线程阻塞下发生。 而已。

不,真的, 绝对没有其他东西了:您将继续使用出色的jOOQ,仅使用效率更高的光纤而不是线程。 Quasar是一个好公民,不会强迫您使用新的API(特别是当原始API很好时,这很好)。

由于JVM 目前不支持可用于实现轻量级线程的本机绿色线程或延续 ,因此Quasar通过字节码检测实现了延续(以及它们之上的光纤)。 这可以在编译时完成,但是使用Quasar的代理通常更方便(尤其是在检测第三方库时),因此这是一个基于Dropwizard的Gradle示例项目 ,其中还包括Quasar代理设置(不要忘了Capsule ,这是一种非常出色的Java部署工具,可满足各种需求,这无疑使使用Quasar和代理变得轻而易举。 该示例未使用所有jOOQ功能,而是属于SQL构建用例 (用于查询和CRUD),但是建议您更改它以适合您的需求。 without-comsat分支包含一个线程阻止版本,因此您可以比较并查看与Comsat版本的(最小)差异。

排队等候在哪里?

您可能现在想知道:好的,但是JDBC是一个线程阻塞 API,Quasar如何将其转换为光纤 阻塞 API? 因为JDBC没有异步模式,所以Quasar在后台使用了一个线程池,光纤在该线程池中调度JDBC操作,并且在JDBC操作完成后将其解冻并计划恢复(请查看Quasar的集成模式以了解更多信息)信息)。

是的,这是讨厌的等待行 :等待线程池执行的JDBC命令。 尽管您并未将数据库并行性提高到超过JDBC线程池的大小,但是即使您仍在使用简单且熟悉的阻塞API,也不会损害光纤。 您仍然可以拥有数百万的纤维。

是否可以改善总体状况? 没有标准的异步Java RDBMS API,我们将无能为力。 但是,如果数据库是您的瓶颈,那么这可能根本不重要。 关于此主题有很多不错的文章和讨论 ,该论据等于确定您要将等待线移至何处。

奖励:巧妙的jOOQ集成

目前,Quasar需要开发人员(或集成商)告诉它要进行检测的内容,尽管正在进行自动检测(此功能取决于Java 9之前不会发布的一些较小的JRE更改)。 如果您可以方便地更改源代码(或已编译的类),则足以使用@Suspendable注释方法或让它们throws SuspendExecution ,但是对于库通常不是这种情况。 但是可以在META-INF/suspendablesMETA-INF/suspendable-supers中分别列出具有要检测的固定名称的方法,分别用于可以具有可挂起实现的具体方法和抽象/接口方法。

如果有很多(或涉及代码生成),则可以编写SuspendableClassifier随集成一起提供,并在Quasar的SPI中注册它以提供其他检测逻辑(请参阅jOOQs )。 SuspendableClassifier的工作是在检测阶段检查有关运行时类路径中每个方法的签名信息,并确定该方法是否可挂起,是否可以挂起,是否可以实现或不确定。 (其他一些分类器稍后可能会说“可悬浮”或“可悬浮-超级”)。

总结一下

好吧……只需要在高效纤维上享受出色的jOOQ!

翻译自: https://www.javacodegeeks.com/2015/06/querying-your-database-from-millions-of-fibers-rather-than-thousands-of-threads.html



推荐阅读
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
  • 都说Python处理速度慢,为何月活7亿的 Instagram依然在使用Python?
    点击“Python编程与实战”,选择“置顶公众号”第一时间获取Python技术干货!来自|简书作者|我爱学python链接|https:www.jian ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • 博客_2018年博客总结
    本文由编程笔记#小编为大家整理,主要介绍了2018年博客总结相关的知识,希望对你有一定的参考价值。前言     ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
author-avatar
逝水无痕--
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有