MQ 杂记

文件上传,短信,画图、截图(削峰)

消息队列(解耦,削峰(早上10点,下午三点),异步),高峰QPS每秒2万,低峰期每秒几百

 

redis:验证码,手机安全码,流程文件,流程图,流程文件,最新列表:lpush,排行榜:sorted set 秒杀

引入mq的缺陷

  1. 可用性降低,复杂性
  2. 插入重复数据:幂等性,数据库,查修改;redis天然幂等性;生成唯一id,先去redis里面查,没有就消费
  3. 消息遗失:(1)生产者写消息的过程中(channel设置成confirm模式,异步回调)(2)rabbitmq接收到消息之后先暂存在自己的内存,rabbitmq挂了(持久化到磁盘    ,queue设置为持久化,deliveryMode设置为2,从磁盘恢复)(kafka leader同步数据到follower之后数据才算成功)(3).消费者拿到消息后消费者挂掉,mq以为被消费了(原因打开了消费者autoAck,关闭    ,消费完后发送ack,mq没收到ack消息会给其他消费者)。事故举例,打开了autoAck,消费者挂了    ,消息丢失,画图没保存,数据丢失
  4. 消息顺序:rabbitmq设置多个queue,每个消费者消费一个queue。多线程消费内存队列,一个内存队列对应一个线程;kafka每个消费者消费一个partition,每个消费者多个内存队列,一个内存队列对应一个线程)压测:如果消费者是单线程消费,如果处理比较耗时,处理一条消息是几十ms,1秒钟只能处理几十条,吞吐量太低,4核8G的机器,单机,32条线程,最高每秒可以处理上千条消息
  5. 消息堆积:临时租借机器搭建10倍数量的partition和消费者,修改原来的消费者写入数据到新的partition,然后10倍新的消费者进行消费

技术选型

activeMQ吞吐量万级,时效性ms级,消息低概率丢失,社区不活跃

rabbitMQ erlang语言,吞吐量万级,效率很高,开源,管理界面,社区相对活跃,没实力维护定制化。rabbitMQ镜像集群模式,每个节点有全部数据,不是分布式,数据量大到磁盘无法装载,管理控制台指定策略所有节点同步数据

rocketMQ吞吐量kafka大数据领域日志采集,实时计算,分布式易扩展


kafka高可用架构,纯分布式消息队列:每台机器+机器上的broker进程,topic partition1 ,topic partition2.....每个partition做副本保证高可用,副本之间选举leader,leader对外提供读写十万级,支持大量topic,消息0丢失,阿里品牌保障,分布式扩展方便

如何架构一个MQ?

  1. 可伸缩性:分布式系统,参考kafka,broker->topic->partition,每个partition放一个机器存一部分数据,资源不够给topic增加partition,然后做数据迁移
  2. 落地磁盘:保证进程挂了数据不丢,落地磁盘顺序写,省去磁盘随机读写寻址的开销
  3. 可用性:多副本->leader &follower->broker挂了重新选举leader即对外服务

Dubbo Service export

DubboNamespaceHandler ->DubboBeandefinitionParser->ServiceBean->ServiceConfig->afterProperties/onApplication-->ref->proxyFactory->Invoker->protocol>spi->DubboProtocol->Exchanger.bind->HeaderExchanger.bind->NettyTransporter.bind->NettyServer->RegistryProtocol

Netty -> NioEventLoop->Selector->n*channel->buffer缓冲区(select/epoll 1024)

主从Reactor:MainReactor 负责客户端的连接请求,并将请求转交给 SubReactor,专门处理Accept事件,每个端口对应一个Boss线程;SubReactor 负责相应通道的 IO 读写请求,和Worker线程在同一个线程池中

Socket ->jvm native ->OS windows select/Linux epoll ->kernel ->物理设备

Dubbo Client refer

DubboNamespaceHandler->ReferenceBean  impl the FactoryBean->getObject->ReferenceConfig#get#createProxy->RegistryProtocol#refer->RegistryDiretory#subscribeUrl向 Zookeeper 订阅服务节点信息并 watch 变更->Cluster->@SPI->FailoverCluster->ExtensionLoader包装clustr自动套上Wrapper->MockClusterWrapper (FailoverCluster)#join->MockClusterInvoker(FailoverClusterInvoker )#doList #notify节点变更通知#refreshInvoker根据invokerURL转换为invoker列表->Router->LoadBalance

你可能感兴趣的:(分布式)