Redis+Kafka异步提高并发
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异步提高并发的更多相关文章
- Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?
1.kafka在高并发的情况下,如何避免消息丢失和消息重复? 消息丢失解决方案: 首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的 ...
- Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程
线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B ...
- PHP写的异步高并发服务器,基于libevent
PHP写的异步高并发服务器,基于libevent 博客分类: PHP PHPFPSocketLinuxQQ 本文章于2013年11月修改. swoole已使用C重写作为PHP扩展来运行.项目地址:h ...
- iOS GCD基础篇 - 同步、异步,并发、并行的理解
1.关于GCD - GCD全称是Grand Central Dispatch - GCD是苹果公司为多核的并行运算提出的解决方案 - GCD会自动利用更多的CPU内核(比如双核.四核) - GC ...
- 使用生成器把Kafka写入速度提高1000倍
title: 使用生成器把Kafka写入速度提高1000倍 toc: true comment: true date: 2018-04-13 21:35:09 tags: ['Python', '经验 ...
- redis 初步认识四(redis锁,防并发)
using System; namespace ConsoleAppRedis { class Program { static void Main(string[] args) { //第一种,无登 ...
- SQL Server数据库读写分离提高并发性
在一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡.遗憾的是,SQL Server 的所有版 ...
- redis实现异步任务队列
redis实现异步任务队列 先说思路: 将任务对象序列为JSON字符串,然后推入REDIS缓存,这叫入队. 通过独立的工作线程从REDIS拉出一个任务,这叫出队,工作线程将JSON字符串还原为任务对象 ...
- STM 软件事务内存——本质是为提高并发,通过事务来管理内存的读写访问以避免锁的使用
对Java程序员来说,我们对面向对象的编程(OOP)自然都是烂熟于胸的,但语言也极大地影响了我们构建面向对象应用程序的方式.(现在的OOP已经和Alan Kay当初创造这个词时候的初衷大不相同了,他的 ...
随机推荐
- PHP array_pad() 函数
实例 返回 5 个元素,并将 "blue" 值插入到数组的新元素中: <?php$a=array("red","green");pri ...
- Python性能分析与优化PDF高清完整版免费下载|百度云盘
百度云盘|Python性能分析与优化PDF高清完整版免费下载 提取码:ubjt 内容简介 全面掌握Python代码性能分析和优化方法,消除性能瓶颈,迅速改善程序性能! 对于Python程序员来说,仅仅 ...
- Spark中直接操作HDFS
Spark作为一个基于内存的大数据计算框架,可以和hadoop生态的资源调度器和分布式文件存储系统无缝融合.Spark可以直接操作存储在HDFS上面的数据: 通过Hadoop方式操作已经存在的文件目录 ...
- 什么是DO,DTO,VO,POJO
俗话说,没有规矩不成方圆,今天来说一下 Java 中的各种 O(bject). 为什么会出现这些 O? 我们知道,这些 O 不管叫什么名字,其本质都还是对象(Object),既然本质都一样,为什么非要 ...
- Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令讲解
上一章节中,我们了解到了Linux系统的最基础的几个文件处理命令,核心的是ls命令,在今天这章中,我们来继续学习Linux对于文件操作相关的一些命令,比如复制.移动.删除.查看等命令. 1.cp 命令 ...
- LeetCode 89,因为题目晦涩而被点了1500+反对的搜索问题
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第55篇文章,我们一起来看看LeetCode中的第89题 Gray Code(格雷码). 这题的官方难度是Medi ...
- Android——对话框的全部内容。(课堂总结)
前面的总结是写过对话框的,但是那只是冰山一角,简单的创建和使用罢了. 今天具体讲下AlertDialog. 首先对话框不需要在布局里写,在活动里new出来的. AlertDialog.Builder ...
- Python datetime 转 JSON
Python datetime 转 JSON Python 中将 datetime 转换为 JSON 类型,在使用 Django 时遇到的问题. 环境: Python2.7 代码: import js ...
- java验证输入是否为三阶幻方
问题描述: 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. 三阶幻方又 ...
- Spring事务专题(五)聊聊Spring事务到底是如何实现的
前言 本专题大纲: 本文为本专题倒数第二篇文章. 在上篇文章中我们一起学习了Spring中的事务抽象机制以及动手模拟了一下Spring中的事务管理机制,那么本文我们就通过源码来分析一下Spring中的 ...