Celery 高频面试题(含详细答案)

什么是 Celery?适合什么场景?

Celery 是基于 Python 的分布式任务队列系统,主要用于处理异步任务、定时任务等。适用于发送邮件、视频转码、数据同步等不要求实时响应的场景。

Celery 架构由哪些核心组件组成?

包括:Broker(消息队列,如 Redis、RabbitMQ)、Worker(任务执行进程)、Task(定义任务逻辑)、Result Backend(存储任务结果)。

Celery 支持哪些消息中间件?

支持 Redis、RabbitMQ、Amazon SQS、MongoDB、Kafka(实验性)等作为 broker。

如何在 Django 中集成 Celery?

创建 celery.py,在 __init__.py 中加载 app,配置 broker 和 backend,使用 @shared_task 装饰器定义任务,启动 worker 即可。

如何为任务设置自动重试?

可使用 autoretry_for 参数,也可以在任务内部手动调用 self.retry() 实现,支持设置最大重试次数、回退时间等。

如何配置定时任务?

使用 Celery Beat,结合 crontab 或 interval 来调度周期性任务。Beat 会将任务发送给 broker,由 worker 执行。

Celery 的任务序列化方式有哪些?

支持 JSON(默认)、pickle、msgpack、yaml 等。建议使用 JSON,因其通用性和安全性更好。

Celery 的任务优先级如何设置?

通过设置不同队列并配置队列权重或 worker 路由策略。支持 priority 参数(取决于 broker)。

如何监控 Celery 运行状态?

使用 Flower 监控 WebUI,或者配置 Prometheus 导出任务状态、失败率、执行时间等指标。

Celery 中如何避免任务重复执行?

可以使用 Redis 锁机制、幂等处理、数据库状态记录等方式避免重复执行。

消息队列(MQ)高频面试题(10题)

为什么使用消息队列?

用于解耦系统、削峰填谷、异步处理、流量缓冲。

常见的 MQ 有哪些?

RabbitMQ、Kafka、RocketMQ、Redis Stream、ActiveMQ 等。

消息队列的可靠性如何保障?

确认机制(ack)、消息持久化、重试机制、幂等性保障。

什么是消息的幂等性?如何实现?

幂等性是指多次执行结果一致。常用唯一 ID + 状态表记录处理结果。

如何避免消息丢失?

设置消息持久化、消费者手动 ack、使用事务或死信队列。

MQ 中的消费模式有哪些?

点对点(queue)和发布/订阅(topic)模型。

如何实现延迟队列?

使用 TTL + 死信队列,或 MQ 提供的延迟插件(如 RabbitMQ 的延迟插件)。

MQ 如何实现消息顺序?

通过 partition + 单个消费者、同一个 key 的消息进入同一个队列。

Kafka 与 RabbitMQ 的区别?

Kafka 是高吞吐日志系统,适合大数据流处理;RabbitMQ 强调可靠投递和事务性。

消息堆积怎么办?

增加消费者实例、提高消费速率、评估上下游处理瓶颈。

Python 高频面试题(含详细答案)

Python 中的 GIL 是什么?它如何影响多线程性能?

GIL(Global Interpreter Lock)是 CPython 中的全局解释器锁,它确保任何时刻只有一个线程可以执行 Python 字节码。这使得 Python 多线程在处理 CPU 密集型任务时性能提升有限,但对于 I/O 密集型任务(如网络、文件)依然有效。

Python 中深拷贝与浅拷贝的区别?

浅拷贝仅复制对象本身及其引用的子对象,修改子对象会影响原对象;深拷贝递归复制所有嵌套对象,二者完全独立。使用 copy.copy() 实现浅拷贝,copy.deepcopy() 实现深拷贝。

Python 如何实现协程?

使用 async def 定义协程函数,使用 await 调用异步操作,配合 asyncio 模块实现协程并发。协程适用于高并发网络 I/O 场景。

列表推导式和生成器表达式有何区别?

列表推导式返回一个完整的列表,占用更多内存;生成器表达式返回一个迭代器,惰性求值,占用内存少,适合处理大数据。

Python 装饰器的作用及常见使用场景?

装饰器用于在函数运行前后自动执行额外逻辑,常见场景有:日志记录、权限验证、缓存、计时、事务控制等。

is 和 == 有何不同?

is 比较的是对象的内存地址(是否同一对象);== 比较的是对象的值是否相等。对于整数、字符串等小对象,可能返回相同结果,但语义不同。

Python 内存管理机制是怎样的?

采用引用计数为主,结合标记-清除和分代回收的垃圾回收机制。可以用 gc 模块查看和控制内存管理行为。

如何避免 Python 中的内存泄漏?

避免循环引用、及时释放资源、使用弱引用(weakref)、确保关闭文件句柄和数据库连接。

如何让一个类支持 with 上下文管理?

需要实现 __enter__()__exit__() 方法。with 语句执行时会自动调用这两个方法进行资源管理。

Python 中有哪些常用的内置数据结构?

包括:list(列表)、tuple(元组)、dict(字典)、set(集合),还有 collections 中的 defaultdict、Counter、deque 等扩展结构。

Redis 与 MySQL 高频面试题(各10题)

Redis 常见数据类型有哪些?

String、List、Set、ZSet(有序集合)、Hash、Stream、Bitmap、HyperLogLog。

Redis 如何实现缓存雪崩、穿透、击穿的防护?

雪崩:设置过期时间 + 限流;穿透:加布隆过滤器;击穿:互斥锁/热点预加载。

Redis 持久化方式有哪些?

RDB(快照)和 AOF(追加日志),可同时使用提高安全性。

Redis 分布式方案有哪些?

主从复制、哨兵模式、Cluster 模式。

如何删除 Redis 中的大 key?

使用 UNLINK 命令异步删除,避免阻塞主线程。

Redis 如何实现过期淘汰机制?

有定期删除 + 惰性删除 + LRU/LFU 淘汰策略。

Redis 为什么是单线程?

采用 I/O 多路复用模型,避免上下文切换,单线程提高了操作原子性。

如何实现 Redis 分布式锁?

使用 SET key value NX EX 实现简单锁,RedLock 实现跨实例锁。

Redis 的事务机制如何?

通过 MULTI、EXEC、WATCH 实现事务操作。

如何监控 Redis 性能?

使用 info 命令、监控慢查询、开启慢日志、自定义监控指标。

MySQL 索引有哪些类型?

主键索引、唯一索引、普通索引、全文索引、组合索引、前缀索引。

什么是最左前缀匹配原则?

联合索引中,从左到右匹配字段,越靠左优先命中索引。

MySQL 如何优化慢查询?

分析执行计划(EXPLAIN)、加索引、优化 where 条件、避免全表扫描。

InnoDB 与 MyISAM 区别?

InnoDB 支持事务、行锁、外键;MyISAM 只支持表锁,无事务。

MySQL 的事务四大特性?

原子性、一致性、隔离性、持久性(ACID)。

常见的 SQL 注入方式?

联合注入、报错注入、布尔盲注、时间盲注。防止方式:参数化查询。

MySQL 的三大日志分别是什么?

binlog(二进制日志)、redo log(重做日志)、undo log(回滚日志)。

什么是覆盖索引?

查询字段都被索引覆盖,查询无需回表。

MySQL 死锁是什么?如何排查?

两个事务互相等待对方资源。使用 SHOW ENGINE INNODB STATUS 查死锁信息。

如何保证数据一致性?

使用事务、锁机制、幂等设计、分布式一致性协议(如两阶段提交)。