一致性 hash 应用场景,一致性 hash 项目实际落地应用案例,spring cloud gateway 自定义负载均衡器,分布式 websocket

望舒的头像
望舒
标签:
负载均衡一致性 hash

遇到一个在网关层针对某些服务作手动负载均衡的需求,保证服务负载均衡的同时,可以持久化、记忆对应的服务实例,重连保持原有服务,采用自定义负载均衡器,一致性 Hash 配合 Redis 持久化数据(重启恢复数据)解决问题。

一致性 Hash 环使用实战使用

通过订阅服务变更事件,获取到 Nacos 服务注册中心目标服务的所有实例列表构造 Hash 环(服务变更则做一次 diff 去除无效节点)

实现自定义服务负载均衡器,为指定服务添加自定义负载均衡器,其他服务使用默认负载均衡器

使用的时候通过目标请求的负载元数据(key)计算 hash 值获取到目标实例节点返回即可

简单代码,根据实际需求改造

复制
public class HashRing {

    private final TreeMap<Integer, Node> hashRing = new TreeMap<>();
    private final Map<String, List<Integer>> nodeHashListMap = new HashMap<>();
    private final int virtualNodeCount;

    public HashRing(@NotNull List<Node> nodes, int virtualNodeCount) {
        this.virtualNodeCount = virtualNodeCount;
        nodes.forEach(this::addNode);
    }

    public void addNode(@NotNull Node node) {
        String nodeId = node.getId();
        List<Integer> nodeHashList = new ArrayList<>();
        for (int index = 0; index < virtualNodeCount; index++) {
            int hashCode = StrUtil.concat(false, nodeId, ":", String.valueOf(index)).hashCode();
            nodeHashList.add(hashCode);
            hashRing.put(hashCode, node);
        }
        nodeHashListMap.put(node.getInstanceId(), nodeHashList);
    }

    public void removeNodeById(@NotNull String nodeId) {
        List<Integer> nodeHashList = nodeHashListMap.remove(nodeId);
        if (Objects.nonNull(nodeHashList)) {
            for (Integer hash : nodeHashList) {
                hashRing.remove(hash);
            }
        }
    }

    public @Nullable Node getNode(String key) {
        if (hashRing.isEmpty()) {
            return null;
        }
        SortedMap<Integer, Node> tailMap = hashRing.tailMap(key.hashCode());
        return hashRing.get(tailMap.isEmpty() ? hashRing.firstKey() : tailMap.firstKey());
    }

}

大致业务流程:

flowchart LR subgraph Requests R1[Service1 Request 1] R2[Service1 Request 2] R3[Service1 Request 3] R4[Service1 Request 4] R5[Service1 Request 5] R6[Service1 Request 6] R7[Other Service Request 7] end Gateway[Gateway 网关] subgraph LoadBalancers[LoadBalancers] LB1[Service1 LoadBalancer 手动负载均衡、持久化、记忆、重连] LB2[Other Service LoadBalancer] end subgraph Services[Service Instances] S1[Service1 Instance 1] S2[Service1 Instance 2] S3[Service1 Instance 3] S4[Service2 Instance 1] end %% 客户端请求指向Gateway R1 --> Gateway R2 --> Gateway R3 --> Gateway R4 --> Gateway R5 --> Gateway R6 --> Gateway R7 --> Gateway %% Gateway请求指向多个负载均衡器 Gateway --> LB1 Gateway --> LB2 %% 负载均衡器指向服务实例 LB1 --> S1 LB1 --> S2 LB1 --> S3 LB2 --> S4

一致性 Hash 环简介及使用场景

什么是一致性 Hash 环?

一致性 Hash(Consistent Hashing)是一种分布式系统中常用的负载均衡算法,主要用于解决节点动态变更时的数据重分布问题。它通过将所有节点和数据映射到一个虚拟的环上,实现高效且稳定的数据分布。

一致性 Hash 环将服务器节点和数据的 Key 都映射到一个环形空间,数据根据哈希值被分配到顺时针方向最近的节点上。当节点增加或减少时,只需要重新分配环上相邻节点之间的部分数据,极大地降低了数据迁移量。

一致性 Hash 环的核心原理

1.哈希映射

服务器节点和数据 Key 均通过哈希函数映射到 0 到 2^32-1 的环形空间上。

2.顺时针查找

数据存储到顺时针方向第一个大于或等于其哈希值的节点上。

3.节点变更影响有限

新节点加入或旧节点离开,仅影响该节点相邻的部分数据,避免大规模数据迁移。

4.虚拟节点机制

为了解决节点分布不均匀的问题,每个物理节点会对应多个虚拟节点,增强负载均衡能力。

一致性 Hash 环的优势

1.减少数据迁移

节点上下线时只影响部分数据,降低系统抖动。

2.高可扩展性

方便动态添加或移除节点,适应分布式环境。

3.负载均衡

虚拟节点机制使得负载更加均匀。

4.容错性好

某个节点挂掉后,只有其负责的数据需要重新分配,不影响整体系统。

一致性 Hash 环的典型使用场景

1.分布式缓存系统

如 Redis Cluster、Memcached 集群中,一致性 Hash 用于决定数据放在哪个缓存节点,保证缓存的可用性和扩展性,避免缓存雪崩。

4.分布式存储系统

如分布式文件系统、对象存储(Ceph、Amazon Dynamo),通过一致性 Hash 环分配数据块到不同存储节点,提高存储的均衡性和容错性。

4.负载均衡

应用层的路由请求分发,根据用户请求的Key(如用户ID)映射到对应服务器,保证请求的路由稳定,减少缓存失效。

4.微服务服务发现

在微服务架构中,利用一致性 Hash 实现服务实例的请求分配,提高调用的稳定性和系统的可扩展性。

如何实现一致性 Hash 环?

实现一致性 Hash 环的关键步骤包括:

设计合适的哈希函数(如 MD5、SHA-1 等)

维护环上节点的有序结构(通常用TreeMap实现)

支持虚拟节点映射以均衡负载

动态更新节点列表时进行局部数据迁移

总结

一致性 Hash 环作为分布式系统中的基础技术,极大地提升了系统的弹性和扩展能力。它解决了传统哈希算法在节点变更时带来的大规模数据迁移问题,是分布式缓存、存储和负载均衡等场景的理想选择。

通过合理设计一致性 Hash 环,可以构建高可用、高性能的分布式应用,满足现代互联网业务对稳定性和可扩展性的需求。

作者:https://blog.xn--rpv331d.com/望舒

链接:https://blog.xn--rpv331d.com/望舒/blog/60

转载注意保留文章出处...

‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​​‌​‌‌‌​​‌‌​‌​‌‌‌‌​‌​​‌​‌‌‌‌​‌‌​‌​​​‌‌​​​​​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌​‌‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌​‌‌‌​​‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌​‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌‌​‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌​‌‌​​‌​​​​​‌‌‌​​‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌​‌‌‌‌​​‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌​‌‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌​‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌‌​‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌​‌‌​​‌​​​​​‌‌‌​​‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌​​‌​​‌‌‌‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌‌‌​​​​​‌​​​‌‌​​​​​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌​‌‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌​‌‌‌​​‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌​‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌‌​‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌​‌‌​​‌​​​​​‌‌‌​​‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌‌‌‌​‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌​‌‌‌‌​​‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​‌‌‌​‌‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌​​‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌​‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌​​‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌​‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌​‌‌‌‌​‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌​‌‌​​‌​​​​​‌‌‌​​‌‌​‌​‌​​‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌​‌‌​‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌​​‌‌‌‌​‌‌‌‌‌​‌‌‌​​‌‌‌​​‌​‌‌‌​‌‌‌​‌‌‌‌‌‌‌‌‌‌‌​‌‌‌​​‌‌‌‌​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌​‌‌‌‌​‌‌‌​​‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌​‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌‌​‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌​​‌‌‌​​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌‌​​​​​‌‌‌​‌‌​‌‌‌‌​​​​‌‌‌‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌​‌‌​​‌‌‌‌‌​‌​​‌​‌​​​‌‌​​‌​‌‌‌​​‌‌​​​​​​‌‌​‌‌​​‌‌​​​​‌‌‌‌‌​​​​​‌​‌​​​​​​​‌‌​​​‌​‌​‌‌​​​​‌‌‌‌‌‌‌‌​​​‌​​​‌‌‌‌​​‌​​‌‌​‌​‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌​‌‌​‌‌‌​‌‌‌‌​‌‌‌‌​‌‌‌‌‌‌‌‌‌‌‌‌‌‌​‌‌‌‌‌
0
0
0
46
No data