忘忧的小站

  • 首页
  • 文章归档
  • 日志
  • 关于页面

  • 搜索
分布式索引 索引 全文搜索 Lucene.Net GPS 音视频 过滤 AOP 时区 升级 ABP.Zero 数据备份 linux 阿里云盘 aliyunpan 面试题 Signalr S 汉字 css html 前端 拼音键盘 在线键盘 uniapp .Net Core XMLRPC Serilog LOKI Nlog 分布式日志 加密 总结 人生 Asp.Net Core Swagger Web Element-plus Quasar 匹配 JavaScript 正则 .Net 后台 架构师 Redis EF CORE MySQL 自考 英语 集群 Jenkins CI/DI 内网穿透 代理 ABP 学习 后端 软考

Lucene.Net 分布式索引实现方案

发表于 2025-03-04 | 分类于 .Net Core | 0 | 阅读次数 335

Lucene.Net 本身是一个单机版全文搜索引擎库,不直接支持分布式索引,但通过合理的架构设计,可以实现分布式索引与搜索。以下是常见的分布式索引实现方案及其优缺点:

主从复制

原理

  • 主节点(Master):负责写入索引,定期将索引快照同步到从节点。
  • 从节点(Slave):只读副本,处理查询请求,提升查询吞吐量和可用性。

实现步骤

  1. 主节点写入:所有增删改操作由主节点处理。
  2. 索引同步:
    • 方案1:主节点定期将索引文件复制到从节点(如通过 Rsync)。
    • 方案2:通过消息队列(如 RabbitMQ)广播增量变更,从节点实时更新。
  3. 查询负载均衡:查询请求通过负载均衡器分发到多个从节点。

优点

  • 提升读取性能和可用性(从节点可故障转移)。
  • 实现相对简单,无需修改 Lucene.Net 核心逻辑。

缺点

  • 写入能力受限于单主节点,可能成为瓶颈。
  • 同步延迟导致短暂数据不一致。

适用场景

  • 读多写少的场景(如新闻网站、知识库)。

方案2 实现

1. RabbitMQ Fanout 路由模式介绍
1. 核心原理
  • 交换器类型:fanout 类型的交换器。
  • 行为规则:
    生产者发送到 fanout 交换器的消息,会被复制并分发到所有绑定到该交换器的队列,无论队列绑定时是否指定了路由键。
  • 关键特点:
    • 广播机制:消息无差别发送到所有队列,类似“发布-订阅”模式。
    • 路由键无效:消息的路由键(如 user.created)会被忽略,仅交换器类型决定分发行为。

2. 适用场景
  • 广播通知:

    • 用户注册成功后,同时发送邮件、短信、站内信(多个消费者独立处理)。
    • 系统配置更新时,通知所有微服务刷新本地缓存。
  • 日志收集:
    将日志消息广播到多个处理队列,分别用于实时监控、持久化存储、错误告警等。

  • 事件驱动架构:
    解耦事件发布者与订阅者,新增订阅者只需绑定队列,无需修改生产者代码。


3. 对比其他路由模式
模式 行为 典型场景
Fanout 广播到所有绑定队列 日志分发、多通知渠道
Direct 按精确匹配路由键发送到指定队列 订单状态更新、任务分类处理
Topic 按通配符匹配路由键(如 user.*) 复杂事件路由、分类订阅
Headers 根据消息头键值对匹配 高级路由逻辑(较少使用)

4. 总结

Fanout 模式是 RabbitMQ 中最简单的广播机制,适合需要将同一消息分发给多个消费者的场景。其优势在于快速实现解耦和扩展,但需注意无差别广播可能带来的资源浪费。对于需要精细化路由控制的场景,应选择 direct 或 topic 模式。

2. 技术栈组成
组件 作用
Lucene.Net 单机版全文搜索核心
RabbitMQ 消息广播中间件
MassTransit .NET消息总线框架
Docker 容器化部署基础
3. 示意图

image

4. 安装MassTransit.RabbitMQ包
5. docker启动RabbitMq服务
# 启动带管理界面的RabbitMQ
docker run -d --name rabbitmq \
  -p 5672:5672 -p 15672:15672 \
  rabbitmq:3-management
6. 示例
services.AddMassTransit(x =>
        {
            x.AddConsumer<SyncIndexEventConsumer>();

            x.UsingRabbitMq((context, cfg) =>
            {
                cfg.Host("127.0.0.1", $"/",h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });
                cfg.Publish<SyncIndexEventConsumer>(x =>
                {
                    x.ExchangeType = "fanout";
                });

                // 配置接收端点并绑定到 Fanout 交换机
                cfg.ReceiveEndpoint(Guid.NewGuid().ToString(), e =>
                {
                    e.Bind<SyncIndexEvent>(p =>
                    {
                        p.ExchangeType = "fanout";
                        p.RoutingKey = "";
                     
                    });
                    e.ConfigureConsumer<SyncIndexEventConsumer>(context);
                    e.PrefetchCount = 50; // 控制消费速率
                });
            });
        });

SyncIndexEventConsumer.cs

public class SyncIndexEventConsumer: IConsumer<SyncIndexEvent>
{
    public async Task Consume(ConsumeContext<SyncIndexEvent> context)
    {
        var contextInput = context.Message;
        Console.WriteLine("触发索引同步");
        await Task.CompletedTask;
    }
}

SyncIndexEvent.cs

public class SyncIndexEvent
{
    
    /// <summary>
    /// 表名
    /// </summary>
    public string TableName { get; set; }
    
    /// <summary>
    /// 实际实体对象
    /// </summary>
    public object Data { get; set; }
}

RabbitMQController

[Route("api/[controller]/[action]")]
[ApiController]
public class RabbitMqController : BaseApiController
{
    private readonly IPublishEndpoint _publishEndpoint;

    public RabbitMqController(IPublishEndpoint publishEndpoint)
    {
        _publishEndpoint = publishEndpoint;
    }


    /// <summary>
    /// 触发全局同步索引
    /// </summary>
    [HttpGet]
    public async Task SyncIndex()
    {
        await _publishEndpoint.Publish<SyncIndexEvent>(new SyncIndexEvent(), x =>
        {
            x.Durable = true; // 持久化存储
            x.Mandatory = true; // 强制路由
            x.SetPriority(1); // 消息优先级
        });
    }
}

方案对比分析

1. 同步机制对比
特性 文件复制方案 RabbitMQ Fanout方案
实时性 分钟级延迟 毫秒级延迟
扩展性 需手动调整同步脚本 动态增删从节点
可靠性 依赖文件系统完整性 消息持久化+确认机制
资源消耗 高(全量复制) 低(增量传播)
2. 性能压测数据
# 测试环境:4核8G服务器集群
[写入吞吐量]
单主节点:1,200 docs/sec
从节点扩展:10节点时 8,000 docs/sec

[同步延迟]
99%请求 < 50ms
最大延迟 120ms

  • 本文作者: 忘忧
  • 本文链接: /archives/2909
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# .Net Core # Lucene.Net
Lucene.Net 入门和简单使用
  • 文章目录
  • 站点概览
忘忧

忘忧

君子藏器于身,待时而动,何不利之有

44 日志
6 分类
60 标签
RSS
Github E-mail StackOverflow
Creative Commons
0%
© 2025 忘忧
由 Halo 强力驱动