常用中间件:MQ、Redis、Nginx

MQ
    MQ是一种消息中间件,比较主流的消息中间件有ActiveMQ、RabbitMQ和kafka,目前公司用的是RabbitMQ。
    在消息中间件中,比较重要的组成是Producer、Consumer、Exchange、Queue、Message。
    消息推送之前,MQ配置:Producer配置Exchange,Exchange绑定queue,queue绑定Consumer。
    其中有两个比较重要的key概念,一个是routing key,一个是binding key。
    routing key:生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则,而这个routing key需要与Exchange Type及binding key联合使用才能最终生效。 在Exchange Type与binding key固定的情况下(在正常使用时一般这些内容都是固定配置好的),我们的生产者就可以在发送消息给Exchange时,通过指定routing key来决定消息流向哪里。 RabbitMQ为routing key设定的长度限制为255 bytes。
    
    binding key:在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key;消费者将消息发送给Exchange时,一般会指定一个routing key;当binding key与routing key相匹配时,消息将会被路由到对应的Queue中。在绑定多个Queue到同一个Exchange的时候,这些Binding允许使用相同的binding key。 binding key 并不是在所有情况下都生效,它依赖于Exchange Type,比如fanout类型的Exchange就会无视binding key,而是将消息路由到所有绑定到该Exchange的Queue。
    
    Exchange的类型有四种:direct、topic、headers、fanout。
    direct:把消息路由到那些binding key与routing key完全匹配的Queue中。
    topic:
        Exchange配置为  routing key=*.orange.*  --> queue1
                        routing key=*.*.rabbit --> queue2
                        routing key=lazy.#   --> queue2
        以上面的配置为例,routingKey=”quick.orange.rabbit”的消息会同时路由到Q1与Q2,routingKey=”lazy.orange.fox”的消息会路由到Q1与Q2,routingKey=”lazy.brown.fox”的消息会路由到Q2,routingKey=”lazy.pink.rabbit”的消息会路由到Q2(只会投递给Q2一次,虽然这个routingKey与Q2的两个bindingKey都匹配);routingKey=”quick.brown.fox”、routingKey=”orange”、routingKey=”quick.orange.male.rabbit”的消息将会被丢弃,因为它们没有匹配任何bindingKey。
    headers:headers的Exchange不依赖于routingkey与bindingkey的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。
    fanout:把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。
    producer将数据推送到Exchange,Exchangetype的配置以及queue的绑定情况,推送消息到相应的queue中,queue会推送到已绑定的相应的Consumer中。
    
    Redis
    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

 

Nginx

集群服务器之间的任务的分发,通过Nginx服务实现。
    Nginx一般被用来处理负载均衡问题,其分发方式有:
        1)轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
        2)weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
        3)ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
        4)fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
        5)url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

你可能感兴趣的:(中间件)