如何设计房产网站搜索提醒系统?新房源匹配自动发邮件
房产网站搜索提醒系统设计方案
核心问题解答
是的,必须找到匹配新房源的用户搜索提醒并发送邮件,这是实现该功能的核心逻辑。
1. 数据库表扩展
首先需要新增两张关键表来支撑功能:
存储用户保存的搜索过滤器
CREATE TABLE saved_searches ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, location VARCHAR(255), size VARCHAR(255), is_active BOOLEAN DEFAULT TRUE, -- 支持用户开启/关闭提醒 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) -- 假设已有用户表存储邮箱等信息 );
记录已发送的提醒(避免重复推送)
CREATE TABLE search_alerts_sent ( saved_search_id INT, property_id INT, sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (saved_search_id, property_id), -- 唯一组合,防止重复发送 FOREIGN KEY (saved_search_id) REFERENCES saved_searches(id), FOREIGN KEY (property_id) REFERENCES property(id) );
2. 触发提醒的两种方案
方案一:实时异步触发(推荐高并发场景)
当新房源插入property表后,不直接同步执行匹配逻辑,而是通过消息队列异步处理:
- 房源入库成功后,把房源ID、location、size打包成消息发送到队列(比如RabbitMQ/Kafka)
- 单独的消费者服务监听队列,取出消息后:
- 从
saved_searches中查询所有location和size匹配且is_active=true的搜索记录 - 对每条匹配记录,检查
search_alerts_sent中是否已有该搜索+房源的组合,跳过已发送的 - 调用邮件服务给对应的用户发送提醒,内容包含房源详情和取消提醒的链接
- 发送成功后,在
search_alerts_sent中插入一条记录
- 从
这种方式不会阻塞房源入库的主流程,避免影响网站核心功能。
方案二:定时批量触发(适合低流量场景)
如果网站用户量不大,可以用定时任务(比如Linux Cron、Java Quartz)定期执行:
- 每隔1小时/半天,查询这段时间内新增的房源
- 对每个新增房源,执行和实时方案一样的匹配、去重、发送逻辑
- 或者反过来,遍历所有活跃的
saved_searches,查询这段时间内新增的匹配房源再发送
优点是实现简单,对主业务无影响;缺点是提醒有延迟,用户不能第一时间收到通知。
3. 性能优化点
- 给
saved_searches的location和size加联合索引,加快匹配查询:CREATE INDEX idx_search_location_size ON saved_searches(location, size); - 给
property表的location、size和新增的created_at字段加索引,方便快速筛选新增房源 - 如果后续数据量极大,可以考虑用Elasticsearch存储房源和搜索条件,用全文检索做快速匹配,比纯SQL效率高很多
4. 业务细节补充
- 邮件里必须放取消该搜索提醒的链接,点击后把
saved_searches的is_active设为false或者直接删除记录 - 限制每个用户最多保存的搜索数量(比如5个),避免无效数据过多
- 记录邮件发送状态,失败的可以重试2-3次,还是失败的就标记下来,后续可以手动处理
内容的提问来源于stack exchange,提问作者GuardianAngel
相关产品推荐
相关产品推荐

