Redis+Kafka异步提高并发

  • Redis+Kafka异步提高并发
    • 设计
    • 实现
      • 提交请求接口
      • Kafka消费队列
      • 异步处理Service
      • 客户端轮询获取结果
      • Redis集群节点配置
    • KafKa集群节点配置
    • 压力测试

Redis+Kafka异步提高并发

我们平时开发的后台接口,如果不优化,比如加缓存,异步等,接口并发量很难上得来,因为业务逻辑处理需要时间,后面的请求都在排队,时间一长就都超时了,这就是压力测试经常遇到的问题。简单说就是并发量上不来,那如何提高并发呢。

设计

提高并发通常有几个步骤,而且是循序渐进的。通常我是按如下几个点来优化并逐步测试。
1.优化我们的基本代码
如循环体内多次与数据库交互,涉及查询和修改,这种肯定需要先优化掉,基本原则就是,尽量减少循环体内与数据库交互的次数
2.加缓存,一般如Memcache, Redis
加缓存的目的也是尽量减少与数据库交互的次数
3.异步处理
使用消息队列MQ,将接收到的请求放入队列,然后马上返回给客户端,再由异步线程来处理队列。
基于以上的优化思路,不想提升并发量都难啊。

实现

这里重点介绍下redis+kafka实现异步

提交请求接口

Controller将客户端请求参数放入KafKa队列,参数校验在Controller层完成。并清理redis缓存,标记Redis队列处理未完成,然后返回给客户端。
客户端收到反馈,但并没有获取到结果数据,这时可以尝试轮询获取结果,因为后台结果正在异步处理中

Kafka消费队列

KafKa消费者线程,消费到指定的topic,获取我们放入队列的请求参数,开始调用Service异步处理

异步处理Service

需要注意:异步处理的耗时问题,如果处理时间太长,队列消费会出现堆积现象,要想办法提高队列处理速度,才能从根本上提高并发。
提高队列的处理速度,无外乎上面提到的基本代码优化和缓存

客户端轮询获取结果

提交请求后,因为后台立即返回接收数据成功,所以前端需要间隔轮询获取打卡结果,比如1秒请求一次循环10次还拿不到结果,说明后台队列处理失败了

Redis集群节点配置

    redis:
cluster:
max-redirects:
# 集群节点
nodes: xxx.xxx.xxx.xx1:6378, xxx.xxx.xxx.xx1: 6379, xxx.xxx.xxx.xx2: 6378, xxx.xxx.xxx.xx2: 6379, xxx.xxx.xxx.xx3: 6378, xxx.xxx.xxx.xx3: 6379
# 密码
password: xxxxxx
# ssl
ssl: false
jedis:
pool:
max-active: -1
max-idle: 8
max-wait: -1
min-idle: 0
timeout: 10000

KafKa集群节点配置

   kafka:
bootstrap-servers: xxx.xxx.xxx.xxx:9092, xxx.xxx.xxx.xxx:9092, xxx.xxx.xxx.xxx:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: check-consumer-group-prd
enable-auto-commit: false
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
listener:
concurrency: 6

我们生产服务器都是双节点,这里Kafka消费者单个节点配置的是6个消费者,总共是12个消费者线程同时消费队列

压力测试

压力测试使用Jemter

作者介绍:小林,狐小E资深开发工程师,专注移动协同办公平台的SAAS软件开发以及轻应用开发
最近开发了一款移动办公软件狐小E

Redis+Kafka异步提高并发的更多相关文章

  1. Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?

    1.kafka在高并发的情况下,如何避免消息丢失和消息重复? 消息丢失解决方案: 首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的 ...

  2. Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程

    线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B ...

  3. PHP写的异步高并发服务器,基于libevent

    PHP写的异步高并发服务器,基于libevent 博客分类: PHP PHPFPSocketLinuxQQ  本文章于2013年11月修改. swoole已使用C重写作为PHP扩展来运行.项目地址:h ...

  4. iOS GCD基础篇 - 同步、异步,并发、并行的理解

    1.关于GCD - GCD全称是Grand Central Dispatch  - GCD是苹果公司为多核的并行运算提出的解决方案  - GCD会自动利用更多的CPU内核(比如双核.四核)  - GC ...

  5. 使用生成器把Kafka写入速度提高1000倍

    title: 使用生成器把Kafka写入速度提高1000倍 toc: true comment: true date: 2018-04-13 21:35:09 tags: ['Python', '经验 ...

  6. redis 初步认识四(redis锁,防并发)

    using System; namespace ConsoleAppRedis { class Program { static void Main(string[] args) { //第一种,无登 ...

  7. SQL Server数据库读写分离提高并发性

    在一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡.遗憾的是,SQL Server 的所有版 ...

  8. redis实现异步任务队列

    redis实现异步任务队列 先说思路: 将任务对象序列为JSON字符串,然后推入REDIS缓存,这叫入队. 通过独立的工作线程从REDIS拉出一个任务,这叫出队,工作线程将JSON字符串还原为任务对象 ...

  9. STM 软件事务内存——本质是为提高并发,通过事务来管理内存的读写访问以避免锁的使用

    对Java程序员来说,我们对面向对象的编程(OOP)自然都是烂熟于胸的,但语言也极大地影响了我们构建面向对象应用程序的方式.(现在的OOP已经和Alan Kay当初创造这个词时候的初衷大不相同了,他的 ...

随机推荐

  1. filter 函数基本写法

    filter 返回一个符合要求的元素所构成的新列表 filter(函数,可迭代对象)   map 和 filter 混合使用将 lst_num 中为偶数的取出来进行加2 和 乘2 操作   2020- ...

  2. PHP natcasesort() 函数

    定义和用法 natcasesort() 函数用"自然排序"算法对数组进行排序.键值保留它们原始的键名. 在自然排序算法中,数字 2 小于 数字 10.在计算机排序算法中,10 小于 ...

  3. @程序员,如何进入BAT这类一线公司?做到这几点的就有机会!

    跟大家聊一聊很多很多很多人问我的一个问题:中小公司的Java工程师该如何规划准备,才能跳槽进入BAT这类一线互联网公司? 作者简介:中华石杉,十余年BAT架构经验,倾囊相授 我用了三个 “很多” 来形 ...

  4. MySQL InnoDB技术内幕:内存管理、事务和锁

    前面有多篇文章介绍过MySQL InnoDB的相关知识,今天我们要更深入一些,看看它们的内部原理和机制是如何实现的. 一.内存管理 我们知道,MySQl是一个存储系统,数据最后都写在磁盘上.我们以前也 ...

  5. Struts/Servlet,action转到jsp后,CSS失效,路径问题(struts2,jsp路径,action路径,action跳转,相对路径,绝对路径)

    问题:使用struts2,如何处理action的路径?还有,在action转到的jsp中,如何写js,css,图 片的路径?(例如访问http://localhost/project/listUser ...

  6. ORACLE不完成恢复ORA-00392,ORA-00312,ORA-00349

    背景: 进行测试库不完全恢复,log_file_name_convert没调整好.rac-asm至单实例-文件系统,recover完成后,mount状态的database  执行 alter data ...

  7. Canal工作原理

    摘自:http://www.importnew.com/25189.html 背景 mysql主备复制实现: 从上层来看,复制分成三步: master将改变记录到二进制日志(binary log)中( ...

  8. 一文学会MySQL的explain工具

    开篇说明 (1) 本文将细致介绍MySQL的explain工具,是下一篇<一文读懂MySQL的索引机制及查询优化>的准备篇. (2) 本文主要基于MySQL5.7版本(https://de ...

  9. 【AHOI2009】中国象棋 题解(线性DP+数学)

    前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...

  10. 解决:HBuilder X 未检测到手机或模拟器

    1.问题 我使用Android 9版本的手机,开发者选项已开启USB调试,但是HBuilderX未检测到手机或模拟器. 2.解决办法 1.找到HBuilderX安装目录下的D:\Archive\HBu ...