精华内容
下载资源
问答
  • redis 发布订阅 性能测试

    万次阅读 2019-07-12 15:54:30
    准备环境 ip服务器 redis版本 是否主从 10.29.190.24 4.0.8 ...一、主从同步下,发布订阅功能是否能正常使用 1、开启五个redis客户端,其中两个主节点,三个从节点 主节点2 订阅configser...

    准备环境

    ip服务器redis版本是否主从
    10.29.190.244.0.8是/主节点
    10.28.36.205 4.0.8是/从节点

    环境如上,已经自建了两台redis,并且已经实现主从同步。

    一、主从同步下,发布订阅功能是否能正常使用

    1、开启五个redis客户端,其中两个主节点,三个从节点

    主节点2 订阅configserver频道

    主节点3 订阅configserver频道

    127.0.0.1:6379> subscribe configserver
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "configserver"
    3) (integer) 1

    从节点1 订阅configserver频道

    从节点2 订阅configserver频道

    从节点3 订阅configserver频道

    127.0.0.1:6379> subscribe configserver
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "configserver"
    3) (integer) 1

    2、主节点一发送消息,测试其他节点能否收到订阅

    主节点发布 "test subscribe"消息

    127.0.0.1:6379> publish configserver "test subscribe"
    (integer) 2

    主节点2 主节点3 打印

    1) "message"
    2) "configserver"
    3) "test subscribe"

    正常接收到消息

    从节点1 从节点2 从节点3 打印

    1) "message"
    2) "configserver"
    3) "test subscribe"

    正常接收到消息

    说明主从同步也一样可以支持发布订阅的功能。具体性能还需进一步测试。

    二、发布订阅性能测试

    1、创建100个线程,订阅test2

    public class RedisSubScribeTask implements Runnable {
        private String Name;
    
        public RedisSubScribeTask(String name) {
            Name = name;
        }
    
        @Override
        public void run() {
            RedisDaoImpl redis = new RedisDaoImpl();
            redis.init();
            Jedis jedis = redis.pool.getResource();
            if (jedis != null) {
                RedisMsgSubListener redisMsgSubListener = new RedisMsgSubListener();
                System.out.println("线程" + Name + "启动");
                jedis.subscribe(redisMsgSubListener, "test2");
            }
        }
    }
    
    
    public static void main(String[] args) {
    
        for (int i = 0; i <= 100; i++) {
            RedisSubScribeTask redisSubScribeTask = new RedisSubScribeTask(String.valueOf(i));
            new Thread(redisSubScribeTask).start();
        }
    
    }
    public class RedisMsgSubListener extends JedisPubSub {
    
        public void onMessage(String channel, String message) {
            System.out.println(channel + " is:" + message);
        }
    
        public void onPMessage(String pattern, String channel, String message) {
        }
    
        public void onSubscribe(String channel, int subscribedChannels) {
        }
    
        public void onUnsubscribe(String channel, int subscribedChannels) {
        }
    
        public void onPUnsubscribe(String pattern, int subscribedChannels) {
        }
        
    } 
    2、定义main方法,发布消息
    public static void main(String[] args) {
        RedisDaoImpl redis = new RedisDaoImpl();
        redis.init();
        redis.pool.getResource().publish("test2", "test");
    }

    3、测试结果为秒回

    4、将线程改为300个,测试结果也为秒回

    5、将连件数升为500,依旧没有延迟

    info clients
    # Clients
    connected_clients:500
    client_longest_output_list:0
    client_biggest_input_buf:0
    blocked_clients:0
    127.0.0.1:6379>

    6、连接数升为1000,其余两个为主从同步。看是否存在延迟

    info clients
    # Clients
    connected_clients:1002
    client_longest_output_list:0
    client_biggest_input_buf:0
    blocked_clients:0

    7、发现依旧没有延迟。并且主从同步的订阅test2的消息,也正常接受。

    127.0.0.1:6379> subscribe test2
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "test2"
    3) (integer) 1
    1) "message"
    2) "test2"
    3) "test"
    1) "message"
    2) "test2"
    3) "test"

    8、针对1000个客户端,并且进行连续发布100个消息

    for (int i = 0; i <= 100; i++) {
     redis.pool.getResource().publish("test2", "test" + i);
    // try {
    // Thread.sleep(1000);
    // } catch (InterruptedException e) {
    // e.printStackTrace();
    // }
     }

    从节点完全打印完成大概耗时2s,性能还算可以。

    1) "message"
    2) "test2"
    3) "test99"
    1) "message"
    2) "test2"
    3) "test100"  

    8、按照现在redis三个区部署,每个区大概60台虚机链接,这样的性能是足够满足我们的业务场景的。

    基本能实现毫秒级配置更新。

    展开全文
  • //发布订阅对象 var eventObj = { //缓存列表,存放订阅者的信息 list:{}, //添加订阅 listen:function(key,fn){ if(!this.list[key]){ this.list[key] = []; } typeof fn==='...
  • public static void Publisher() { Phone phone = new Phone() { Id = 123, Name = "华为P9
  • Redis 发布订阅

    2020-12-16 17:06:39
    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— ...
  • SQL Server 发布订阅

    2018-04-25 11:31:00
    SQL Server 发布订阅:SQL Server 2008 数据库同步的具体方式参照.
  • redis发布订阅小案例

    2018-08-22 09:29:28
    实现redis发布订阅的一个小Demo,一个发布消息,其他订阅了的都能接收消息
  • rabbitmq发布订阅

    2017-07-11 10:05:13
    看了一天官方文档,自己写了一个发布订阅,已经用于我们的公网环境。
  • C# Redis发布订阅Demo

    2018-10-23 13:30:55
    Redis支持跨进程发布订阅机制。代码实现了key过期的notification.
  • Redis系列之发布订阅

    万次阅读 2020-06-02 13:07:40
    通过Redis可以实现简单的消息,Redis为我们提供了一个发布订阅的功能,下面我们来认识下Redis的发布订阅发布订阅模型 发布者将消息发布发布到channel频道上,所有订阅了channel频道的客户端都会接收到消息,...

    前言

    通过Redis可以实现简单的消息,Redis为我们提供了一个发布订阅的功能,下面我们来认识下Redis的发布订阅。

     

    发布订阅模型

    发布者将消息发布发布到channel频道上,所有订阅了channel频道的客户端都会接收到消息,如下图:

    相关功能

    订阅端: subscribe/psubscribe 频道名称   取消订阅:unsubscribe/punsubscribe

    发布端: publish 频道名称 发布内容

     

    相关命令

    订阅指定的一个或多个频道的信息:subscribe channel

    将信息发送到指定的频道:publish channel msg

     

    订阅指定的一个或多个频道信息(*匹配):订阅以channel开头的所有频道

    psubscribe channel* 

     

    取消订阅指定频道:unsubscribe channel

     

    取消订阅所有匹配频道:punsubscribe channel*

     

    查看所有订阅的频道:pubsub channels

    展开全文
  • Redis发布订阅和应用场景

    万次阅读 热门讨论 2017-11-10 08:46:39
    发布订阅-应用场景 Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的...

    发布订阅-应用场景

    Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。

    这一功能最明显的用法就是构建实时消息系统,比如普通的即时聊天,群聊等功能。

    订阅某个channel的信息

    发布信息到某个channel

    简单的应用场景的话, 以门户网站为例, 当编辑更新了某推荐板块的内容后:

    CMS发布清除缓存的消息到channel (推送者推送消息)

    门户网站的缓存系统通过channel收到清除缓存的消息 (订阅者收到消息),更新了推荐板块的缓存

    Redis 发布订阅架构

    Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel

    • 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。
    • Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。

    Redis 发布订阅命令

    PSUBSCRIBE pattern [pattern ...]

    订阅一个或者多个符合模式匹配的频道

    假设客户端同时订阅了某种模式和符合该模式的某个频道,那么发送给这个频道的消息将被客户端接收到两次,只不过这两条消息的类型不同,一个是message类型,一个是pmessage类型,但其内容相同。 

    PUBSUB subcommand [argument [argument ...]]

    返回由活跃频道组成的列表,即可以查询订阅与发布系统的状态

    PUBLISH channel message 

    发送消息到指定的频道

    其返回值为接收到该消息的订阅者的数量

    SUBSCRIBE channel [channel ...] 

    订阅一个或多个频道

    其返回值包括客户端订阅的频道,目前已订阅的频道数量,以及接收到的消息,其中subscribe表示已经成功订阅了某个频道

    PUNSUBSCRIBE [pattern [pattern ...]] 

    退订所有符合模式匹配的频道

    UNSUBSCRIBE [channel [channel ...]] 

    退订一个或多个频道

    Redis采用UNSUBSCRIBE和PUNSUBSCRIBE命令取消订阅,其返回值与订阅类似。 
    由于Redis的订阅操作是阻塞式的,因此一旦客户端订阅了某个频道或模式,就将会一直处于订阅状态直到退出。

    在SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE和PUNSUBSCRIBE命令中,

    其返回值都包含了该客户端当前订阅的频道和模式的数量,当这个数量变为0时,该客户端会自动退出订阅状态。

     

    Redis发布订阅与ActiveMQ的比较

    1ActiveMQ支持多种消息协议,包括AMQPMQTTStomp等,并且支持JMS规范,但Redis没有提供对这些协议的支持

    2ActiveMQ提供持久化功能,但Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;

    3ActiveMQ提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis没有提供消息传输保障

    总之,ActiveMQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门做发布订阅的,

    但是如果系统中已经有了Redis,并且需要基本的发布订阅功能,就没有必要再安装ActiveMQ了,

    因为可能ActiveMQ提供的功能大部分都用不到,而Redis的发布订阅机制就能满足需求。

     

    参考来源:https://www.cnblogs.com/yitudake/p/6747995.html

    展开全文
  • kafka 发布订阅 这是第四个柱中的一系列关于同步客户端集成与异步系统( 1, 2, 3 )。 在这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现。 卡夫卡概念 根据官方文件 : Kafka是一种...

    kafka 发布订阅

    这是第四个柱中的一系列关于同步客户端集成与异步系统( 1, 2, 3 )。 在这里,我们将尝试了解Kafka的工作方式,以便正确利用其发布-订阅实现。

    卡夫卡概念

    根据官方文件

    Kafka是一种分布式的,分区的,复制的提交日志服务。 它提供消息传递系统的功能,但具有独特的设计。

    Kafka作为集群运行,这些节点称为代理。 代理可以是领导者或副本,以提供高可用性和容错能力。 代理负责分区,分区是存储消息的分发单元。 这些消息是有序的,可以通过名为offset的索引进行访问。 一组分区构成一个主题,是消息的提要。 分区可以具有不同的使用者,并且它们使用自己的偏移量访问消息。 生产者将消息发布到Kafka主题中。 Kafka文档中的以下图表可以帮助您理解这一点:

    话题

    排队与发布-订阅

    消费者群体是另一个关键概念,有助于解释为什么Kafka比RabbitMQ等其他消息传递解决方案更灵活,功能更强大。 消费者与消费者群体相关联。 如果每个使用者都属于同一个使用者组,则主题的消息将在各个使用者之间平均负载均衡; 这就是所谓的“排队模型”。 相反,如果每个使用者都属于不同的使用者组,则所有消息都将在每个客户端中使用。 这就是所谓的“发布-订阅”模型。

    您可以混合使用这两种方法,分别针对不同的需求使用不同的逻辑使用者组,并在每个组中有多个使用者以通过并行提高吞吐量。 同样, Kafka文档中的另一个图表:

    消费者群体

    了解我们的需求

    执法

    正如我们在以前的文章(见1, 2, 3 )该项目服务发布消息到卡夫卡的话题叫item_deleted 。 此消息将位于该主题的一个分区中。 为了定义消息将驻留在哪个分区,Kafka提供了三种选择

    • 如果记录中指定了分区,请使用它
    • 如果未指定分区但存在密钥,则根据密钥的哈希值选择一个分区
    • 如果不存在分区或密钥,则以循环方式选择一个分区

    我们将使用item_id作为密钥。 执法服务的不同实例中包含的消费者仅对特定分区感兴趣,因为他们保留某些项目的内部状态。 让我们检查不同的Kafka使用者实现,以了解哪种使用最方便。

    卡夫卡消费者

    卡夫卡共有三个消费者: 高级消费者简单消费者新消费者

    在这三个消费者中, 简单消费者在最低级别上运行。 它满足我们的要求,因为它允许消费者“在流程中仅使用主题中分区的子集”。 但是,如文档所述:

    SimpleConsumer确实需要使用者组中不需要的大量工作:

    • 您必须跟踪应用程序中的偏移量,才能知道从何处停止消费
    • 您必须确定哪个Broker是主题和分区的主要Broker。
    • 您必须处理经纪人负责人变更

    如果您阅读了建议的用于处理这些问题的代码,则将不鼓励您使用此使用者。

    新使用者提供正确的抽象级别,并允许我们订阅特定的分区。 他们在文档中建议以下用例:

    第一种情况是,如果进程正在维护与该分区相关联的某种本地状态(例如本地磁盘上的键值存储),因此该进程应仅获取其在磁盘上维护的分区的记录。

    不幸的是,我们的系统使用的是Kafka 0.8,而该使用者仅从0.9开始可用。 我们没有足够的资源来迁移到该版本,因此我们需要坚持使用高级消费者

    该使用者提供了一个不错的API,但不允许我们订阅特定的分区。 这意味着,执法服务的每个实例都将使用每条消息,甚至是无关的消息。 我们可以通过为每个实例定义不同的消费者组来实现这一目标。

    利用Akka Event Bus

    在上一篇文章中,我们定义了一些等待ItemDeleted消息的有限状态机ItemDeleted

    when(Active) {
        case Event(ItemDeleted(item), currentItemsToBeDeleted@ItemsToBeDeleted(items)) =>
          val newItemsToBeDeleted = items.filterNot(_ == item)
          newItemsToBeDeleted.size match {
            case 0 => finishWorkWith(CensorResult(Right()))
            case _ => stay using currentItemsToBeDeleted.copy(items = newItemsToBeDeleted)
          }
      }

    我们的卡夫卡消费者可以将所有消息转发给那些演员,并让他们丢弃/过滤不相关的物品。 但是,我们不想让演员浪费很多多余的工作,因此我们将添加一层抽象,让他们以真正有效的方式丢弃适当的消息。

    final case class MsgEnvelope(partitionKey: String, payload: ItemDeleted)
    
    class ItemDeletedBus extends EventBus with LookupClassification {
      override type Event = MsgEnvelope
      override type Classifier = String
      override type Subscriber = ActorRef
    
      override protected def mapSize(): Int = 128
    
      override protected def publish(event: Event, subscriber: Subscriber): Unit = subscriber ! event.payload
    
      override protected def classify(event: Event): Classifier = event.partitionKey
    
      override protected def compareSubscribers(a: Subscriber, b: Subscriber): Int = a.compareTo(b)
    }

    Akka Event Bus按分区为我们提供订阅,而我们的Kafka高级消费者中缺少该分区。 我们将从卡夫卡消费者处发布每条消息到公交车上:

    itemDeletedBus.publish(MsgEnvelope(item.partitionKey, ItemDeleted(item)))

    在上一篇文章中,我们展示了如何使用该分区键订阅消息:

    itemDeletedBus.subscribe(self, item.partitionKey)

    LookupClassification将过滤不需要的消息,因此我们的参与者不会过载。

    摘要

    得益于Kafka提供的灵活性,我们能够设计我们的系统以了解不同的折衷方案。 在接下来的文章中,我们将看到如何协调这些FSM的结果以向客户端提供同步响应。

    第一部分 | 第2部分 | 第三部分

    翻译自: https://www.javacodegeeks.com/2016/05/publish-subscribe-model-kafka.html

    kafka 发布订阅

    展开全文
  • 本案例包含redis的发布订阅功能,以及dotnet core+SignalR实现的简单即时通信,并提供文档笔记。本案例初衷是想结合redis的发布订阅功能+websocket实现消息客户端页面订阅指定的消息,并在客户端页面进行显示;
  • Redis发布订阅

    万次阅读 2018-01-22 22:46:59
    Redis发布订阅 发布订阅: 发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅 订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道...
  • 最通俗易懂的Redis发布订阅及代码实战

    万次阅读 多人点赞 2020-03-30 10:30:14
    除了使用List实现简单的消息队列功能以外,Redis还提供了发布订阅的消息机制。在这种机制下,消息发布者向指定频道(channel)发布消息,消息订阅者可以收到指定频道的消息。
  • 手写发布订阅模式 EventEmitter

    千次阅读 2019-10-22 16:28:40
    手写发布订阅模式 EventEmitter 1.简介 最近发现好多大厂面试题里都有手写发布订阅模式 EventEmitter,原因是 vue 和 react 的非父子组件的通信就是靠他实现的,下面是一个简易版的 EventEmitter。 2.代码 // 发布...
  • springboot 发布订阅

    千次阅读 2020-10-10 15:41:40
    springboot 发布订阅,可以实现基于事件驱动对业务进行解耦 这里模拟下订单发消息业务,实现如下 1、定义 Order 实体类 package com.tdemo.learn.bean; import lombok.Data; @Data public class Order { ...
  • Redis总结之发布订阅

    千次阅读 多人点赞 2020-07-14 21:29:37
    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 发布者不是直接将消息发送给特定的接收者(订阅者),而是将发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。 ...
  • java实现Redis消息发布订阅

    千次阅读 2019-06-18 14:57:29
    Redis发布订阅架构 Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到...
  • 主要介绍了Vue发布订阅模式实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 一个简单的消息发布订阅的Demo,非常容易上手。分享出来,同时记录一下。下次再用到的时候可以找到。分享学习
  • 订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这篇文章主要介绍了发布订阅模式在vue中的实际运用,需要的朋友可以参考下
  • 主要介绍了JavaScript设计模式之观察者模式与发布订阅模式,结合实例形式详细分析了JavaScript观察者模式与发布订阅模式相关概念、原理
  • Redis系列-发布订阅

    2018-06-04 10:33:24
    发布订阅 发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。 pub/sub 不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理...
  • Redis发布订阅模式浅析

    千次阅读 2018-01-31 00:44:05
    最近写一个模块时,用到了缓存,由于是两个服务之间的通信,所以会遇到数据不一致的情况,最后选择了使用Redis的发布订阅模式进行解决。 什么是发布订阅? 这就如同是我们常用的朋友圈,我们发送朋友圈时就是一个...
  • 简单的用图描述了一下数据A系统到B系统经过的流程,数据的走向,以及请求响应和发布订阅的区别,就是同步和异步的区别;如果还不理解就举例说明一下,比如银行取钱,这个动作就属于请求响应,输入金额后,拿到钱了,...
  • 发布订阅原理实现

    2019-10-19 16:17:21
    1.发布订阅在很多地方很常见,其原理就是把想要执行的方法放到数组里面去,然后遍历数组执行里面的方法 其中把方法添加到数据叫订阅 遍历数组执行里面的方法叫发布 接下来,上代码 //发布订阅 function Dep(){ ...
  • 资源名称:sqlserver高级:发布订阅服务器配置手册 资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
  • JMS之发布订阅模型

    千次阅读 2017-07-21 14:56:12
    前篇文章写了点对点模型,下面就发布订阅模型实例整理下。 发布者/订阅者模型支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道...
  • Redis实现消息队列之发布订阅模式

    千次阅读 2020-06-18 01:06:09
    发布订阅(pub/sub)是一种消息通信模式:发送者(pub)在某一频道发送消息,订阅者(sub)接收消息。发布订阅模式类似与微博关注,比如说博主mango被张三、李四、王五关注,那么mango发一篇微博的时候张李王三人都会从...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,899
精华内容 93,159
关键字:

发布订阅