并发、消息队列、缓存_消息队列与缓存的区别-程序员宅基地

技术标签: 并发  

"并发"会引发关于"顺序"的问题,及如何能够在使用高并发提高效率的同时,又在一定程度上能够“控制/维持”一定的操作顺序。更广泛的,有关并发的"锁"操作,也都会围绕同样的思路来解决问题。

没有银弹

想要在维持并发的同时,通过什么魔法来同时维持顺序是不可能的。最基本的核心想法是,将并发的操作变为串行,那么操作也就自然会有了顺序

这是一个看似有些矛盾的解决方案。并发的目的不就是为了提高效率么?!如果将并发变成串行,那之前的并发还有什么意义?

这是一个非常微妙的问题,如果不仔细考虑,很容易在表面上陷入上面的矛盾纠葛之中。而调和这两者的基本思路是:

  • “使用并发"来提高效率和"放弃并发"来顺序化,这两个过程可以完全不必发生在同一个地方。可以让效率的瓶颈部分"计算"并行化,而让结果的聚合过程"顺序化”。
  • 可以根据"顺序化"的要求来建立独立的分组,让一个过程在group之间并行化,而在这个group内部做细致的串行,从而在保证局部顺序的同时在全局建立效率更高的并行化。

那么最基本的,使用一个队列来顺序化一些列的并发结果,是非常显而易见的。

为什么考虑queue这样的数据结构?正如其名字所暗示的,当有成群的人从四面八方涌来进入一个入口时,保证有序化的一个最基本的方式是:让他们排队。

而这种思想并不需要局限在人群中,而可以抽象出来,为任何抽象的并发任务提供一个解答思路:让所有从四面八方同时冒出来的任务排好队,也即是让它们都进入到一个queue的数据结构中。而为了保证出队、入队的有序性,具备加锁功能的blockingQueue是必须的。

如此就形成了并发任务顺序化的基本思路:让这些并发任务都进入到一个blockingQueue中,出队的过程自然保证了这些任务的有序性。

而把这一思路规模化、稳健化的一个中间件,便是Kafka了。而如果只是轻量级小范围的使用,例如Java中的一个局部,则只需要使用好库里面的BlockingQueue就行了。

“排队"这种思想不只可以应用于"控制并发任务的顺序”,也能够被用来解决任务的加锁问题。诸如Java中的synchronized关键字,在背后所依赖的数据结构也是多个blockingQueue。道理很简单,当你想要控制一堆任务的访问权限,那么,让它们进入一个队列依次获取权限就可以了。

下一个问题是,okay,我知道消息队列可以保存一堆任务,可是,我的任务涉及一大堆的函数执行和数据调度,一个小小的queue能够保存那么多的数据或者操作过程吗?又或是,我的任务只是单纯的执行任务,是一个个的"动作",这东西怎么能够被保存在queue中呢?这些疑问基本上会基于我们潜意识的一个印象,queue所保存的是一个string,可我需要保存的类型多种多样,甚至不是数据而是操作,一堆string的queue真的够吗?

同样的问题会发生在"缓存"的使用上,例如大名鼎鼎的Redis/Memcached。都说缓存很有用,但同样的问题是,在这些中间件中存储一个string能够满足我们的需求吗?

这就涉及到对序列化的讨论,特别地,对json数据的转换。无论你是做并发的"操作",还是有大量的数据需要运行,你都可以将其逐层分解为几个核心的、互相配合的数据块。你并不需要将所有的东西都放在缓存中,只需要将那个能够带动其他东西完成整个流程的关键部分放入到缓存中。

在以前的client-server交互中,前后端耦合非常厉害。而基于json数据格式的Restful API之所以能够流行起来,就在于json数据本身成为了前后端之间的不变量,从而可以实现真正意义上的前后端分离。在这里,json数据充当了前后端的业务协议,是真正不变的business logic。

那么同样的,你的缓存中真正应该存储的,就是能够带动各种并发操作的不变量,它可以以json的形式展示,也可以以对象被序列化之后的别的形式展示。但无论是哪一种,都可以被表示为string。更一般地,按照Unix的哲学,一切皆文件。而文件是什么?无非是一堆二进制码,即string。所谓的"信息工程",information的基本表示方式不就是string么。由此我们便能回答之前提出的问题:小小的string能干什么呢?Everything。

如此,提高效率使用缓存中间件(如Redis/Memcached),顺序化、整合复杂的并发任务使用消息队列(如Kafka/RabbitMQ),都是在捣鼓string。而只要能够将string的运输批量化、系统化,那么任何的操作和数据都可以如法炮制。

如此来看,作为重要和酷炫技术的缓存和消息队列,其牛鼻子就是最简单的排队和信息的字符串表示。只要牵住了这个牛鼻子,其它建立在其上的复杂技艺便能够迎刃理解。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kid551/article/details/89511456

智能推荐

字符,字节和编码-程序员宅基地

文章浏览阅读39次。级别:中级摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。本文的内容涵盖了“中文问题”,“乱码问题”。掌握编码问题的关键是正确地理解相关概念,编码所涉及的技术其实是很简单的。因此,阅读本文时需要慢读多想,多思考。引言“字符与编码”...

Linux 修改 ELF 解决 glibc 兼容性问题_glibc_private-程序员宅基地

文章浏览阅读1.1k次。Linux glibc 问题相信有不少 Linux 用户都碰到过运行第三方(非系统自带软件源)发布的程序时的 glibc 兼容性问题,这一般是由于当前 Linux 系统上的 GNU C 库(glibc)版本比较老导致的,例如我在 CentOS 6 64 位系统上运行某第三方闭源软件时会报:[root@centos6-dev ~]# ldd tester./tester: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by._glibc_private

wxWidgets:常用表达式_wxwidget 正则表达式 非数字字符-程序员宅基地

文章浏览阅读282次。wxWidgets:常用表达式wxWidgets:常用表达式不同风味的正则表达式转义Escapes元语法匹配限制和兼容性基本正则表达式正则表达式字符名称wxWidgets:常用表达式一个正则表达式描述字符的字符串。这是一种匹配某些字符串但不匹配其他字符串的模式。不同风味的正则表达式POSIX 定义的正则表达式 (RE) 有两种形式:扩展正则表达式(ERE) 和基本正则表达式(BRE)。ERE 大致是传统egrep 的那些,而 BRE 大致是传统ed 的那些。这个实现增加了第三种风格:高级正则表达式_wxwidget 正则表达式 非数字字符

Java中普通for循环和增强for循环的对比_for循环10万数据需要时间-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏11次。Java中普通for循环和增强for循环的对比_for循环10万数据需要时间

学习PCB设计前的知识扫盲_pcb端子设计基础知识-程序员宅基地

文章浏览阅读2.7k次,点赞13次,收藏97次。0.工厂制作PCB线路板流程1.PCB的结构铜层阻焊丝印本质(PCB画电路板到底在画什么)基础工艺指标2.PCB图中的元素元素布局布线叠层设计3.PCB的设计依据原理图原理图元件库4.PCB的设计流程——总结_pcb端子设计基础知识

Python读取Excel内容;将读取的数据转换为list类型便于切片处理;列表的操作方法;pandas处理DataFrame类型数据;pandas操作;Python几种取整的方法_pandas excel list-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏19次。Python读取Excel内容;将读取的数据转换为list类型便于切片处理;列表的操作方法;pandas处理DataFrame类型数据_pandas excel list

随便推点

Qt Creator 安装 VLD_qtcreater vld-程序员宅基地

文章浏览阅读509次。Qt Creator 安装 VLD2015-04-14 16:52:55你好L阅读数 2325更多分类专栏:qt版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/lin_jianbin/article/details/45044459一、环境说明1、VLD内存..._qtcreater vld

Linux 开发环境工具[zt]-程序员宅基地

文章浏览阅读120次。软件集成开发环境(代码编辑、浏览、编译、调试)Emacs http://www.gnu.org/software/emacs/Source-Navigator 5.2b2 http://sourceforge.net/projects/sourcenavAnjuta http://anjuta.sourceforge...._linux上安装flawfinder

java小易——Spring_spring的beanfactory是hashmap吗-程序员宅基地

文章浏览阅读109次。SpringIoC DI AOPspring底层用的是ConcurrentHashMap解耦合:工厂模式:需要一个模板控制反转 IoC将原来有动作发起者(Main)控制创建对象的行为改成由中间的工厂来创建对象的行为的过程叫做IoC一个类与工厂之间如果Ioc以后,这个时候,动作发起者(Main)已经不能明确的知道自己获得到的对象,是不是自己想要的对象了,因为这个对象的创建的权利与交给我这个对象的权利全部转移到了工厂上了所用包:DOM4j解析XML文件lazy-init = _spring的beanfactory是hashmap吗

温故而知新:部分常见的图像数学运算处理算法的用途_图像处理算啊-程序员宅基地

文章浏览阅读1.3k次,点赞29次,收藏24次。本文将图像处理中常用的数学运算算法及其对图像的作用做了个汇总介绍,有助于图像处理时针对对应场景快速选择合适的数学算法。_图像处理算啊

EM Agent Fatal agent error: State Manager failed at Startup_check agent status retcode=1-程序员宅基地

文章浏览阅读1.1k次。EM 不定期异常宕机,问题重复出现,之前几次因为忙于其它事,无力兼顾,等回头处理时,发现EM已恢复正常。这次问题又重现,准备彻底解决,过程如下:1. 重新启动EM失败,报错:/u01/oracle/agent/core/12.1.0.5.0/bin/emctl status agentOracle Enterprise Manager Cloud Control 12c Relea_check agent status retcode=1

JVM常用调优参数 ——JVM篇_jvm调优-程序员宅基地

文章浏览阅读1.9w次,点赞50次,收藏366次。JVM常用性能调优参数详解​ 在学习完整个JVM内容后,其实目标不仅是学习了解整个JVM的基础知识,而是为了进行JVM性能调优做准备,所以以下的内容就是来说说JVM性能调优的知识。一、性能调优​ 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等等。​ 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标发现性能瓶颈性能调优通过监控及数据统计工具获得数据确认是否达到目标二、何时进_jvm调优