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. PHP image2wbmp - 输出WBMP图片

    image2wbmp — 以 WBMP 格式将图像输出到浏览器或文件.高佣联盟 www.cgewang.com 语法 int image2wbmp ( resource $image [, strin ...

  2. PHP defined() 函数

    实例 检查某常量是否存在: <?phpdefine("GREETING","Hello you! How are you today?");echo de ...

  3. MOS 预夹断到底是什么

    https://www.cnblogs.com/yeungchie/ MOS管就像一个开关,栅极(Gate)决定源极(Souce)到漏极(Drain)的沟道(Channel)是开还是关.以NMOS为例 ...

  4. P4221 [WC2018]州区划分 无向图欧拉回路 FST FWT

    LINK:州区划分 把题目中四个条件进行规约 容易想到不合法当前仅当当前状态是一个无向图欧拉回路. 充要条件有两个 联通 每个点度数为偶数. 预处理出所有状态. 然后设\(f_i\)表示组成情况为i的 ...

  5. luogu P4008 [NOI2003]文本编辑器 splay 块状链表

    LINK:文本编辑器 这个东西感觉块状链表写细节挺多 (块状链表本来就难写 解释一下块状链表的做法:其实是一个个数组块 然后利用链表给链接起来 每个块的大小为sqrt(n). 这样插入删除的时候直接暴 ...

  6. SpringMvc异常处理和SpringMvc拦截器

    1. 异常处理思路 Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进 行异常的处理. SpringMVC的异 ...

  7. SpringBoot中使用AOP打印接口日志的方法(转载)

    前言 AOP 是 Aspect Oriented Program (面向切面)的编程的缩写.他是和面向对象编程相对的一个概念.在面向对象的编程中,我们倾向于采用封装.继承.多态等概念,将一个个的功能在 ...

  8. 一文搞懂Linux系统开发

    先列一下Linux系统开发要掌握的知识,以后有时间再一一介绍. 欢迎关注我的微信公众号:fensnote 文章目录 Linux系统开发会用到什么? C语言基础 shell脚本 学会使用Makefile ...

  9. 一个C++版本的Sqlite3封装--SmartDb

    Sqlite是一个非常轻量级的开源数据库,在嵌入式系统中使用的比较多,存储管理数据非常方便,Sqlite库提供的基于C语言的API,用起来也挺简单,但是有一点不太好的就是API使用起来有些繁琐,另外就 ...

  10. Flask 框架小记

    Flask 框架小记 Flask 实例 创建示例的代码 from flask import Flask # __name__ 是模块名, 用于反射导入模块 app = Flask(__name__, ...