前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RabbitMQ之死信队列(实战篇)

RabbitMQ之死信队列(实战篇)

作者头像
小熊学Java
发布于 2023-07-16 06:32:56
发布于 2023-07-16 06:32:56
61200
代码可运行
举报
文章被收录于专栏:全栈学习之路全栈学习之路
运行总次数:0
代码可运行

1、概念

先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。 **应用场景:**为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息消费发生异常时,将消息投入死信队列中;还有比如说: 用户在商城下单成功并点击去支付后在指定时间未支付时自动失效

2、死信的来源

  • 消息 TTL 过期
  • 队列达到最大长度(队列满了,无法再添加数据到 mq 中)
  • 消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false.

3、实战

1、代码架构图

流程说明:

  1. 一个生产者,两个消费者,交换机为直接类型
  2. 正常流程:生产者发送消息,经过正常队列后,由 C1 进行消费
  3. 产生三大问题后的流程:生产者发送消息,经过正常队列,由于出现了三大问题,C1没有接收到消息,不能进行消费,需转发到死信交换机中的队列里,由C2进行消费。

实现说明:

  • 由于C1未进行消费,需转发到C2,所以C1消费者需创建两个交换机和队列
  • C2只需进行正常消费死信队列的消息即可

2、消息 TTL 过期

1、场景模拟

  1. 先启动消费者C1,创建好交换机和队列
  2. 关闭C1,然后启动生产者和消费者C2
  3. 因C1被关闭,所以生产者发送的消息无法被消费,过了时间后,会进入死信队列,被C2进行消费
2、消费者01
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Consumer01 {

    /**
     * 正常交换机
     */
    public static final String NORMAL_EXCHANGE = "normal_exchange";

    /**
     * 死信交换机
     */
    public static final String DEAD_EXCHANGE = "dead_exchange";

    //正常队列
    public static final String NORMAL_QUEUE = "normal_queue";
    //死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        //声明交换机
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);

        //正常队列绑定死信队列信息
        Map<String, Object> params = new HashMap<>();
        //设置过期时间
//        params.put("x-message-ttl", 10000);
        //正常队列设置死信交换机 参数 key 是固定值
        params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
        //正常队列设置死信 routing-key 参数 key 是固定值
        params.put("x-dead-letter-routing-key", "dead");
        channel.queueDeclare(NORMAL_QUEUE, false, false, false, params);
        //声明队列 不共享 不持久化 不删除
        channel.queueDeclare(DEAD_QUEUE, false, false, false, null);

        //绑定交换机和队列
        channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, "normal");
        channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "dead");
        System.out.println("等待接收消息......");
        DeliverCallback deliverCallback =  (consumerTag, deliver) ->{
            //获取消息
            String message = new String(deliver.getBody(), "UTF-8");
            System.out.println("Consumer01接收到的消息为:" + message);
        };
        channel.basicConsume(NORMAL_QUEUE, true, deliverCallback, cancelCallback -> {});
    }
}
3、消费者02
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Consumer02 {

    /**
     * 死信交换机
     */
    public static final String DEAD_EXCHANGE = "dead_exchange";


    //死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        //声明交换机
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明队列 不共享 不持久化 不删除
        channel.queueDeclare(DEAD_QUEUE, false, false, false, null);

        //绑定交换机和队列
        channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "dead");
        System.out.println("等待接收消息......");
        DeliverCallback deliverCallback =  (consumerTag, deliver) ->{
            //获取消息
            String message = new String(deliver.getBody(), "UTF-8");
            System.out.println("Consumer02接收到的消息为:" + message);
        };
        channel.basicConsume(DEAD_QUEUE, true, deliverCallback, cancelCallback -> {});
    }
}
4、生产者
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Product {
    /**
     * 正常交换机
     */
    public static final String NORMAL_EXCHANGE = "normal_exchange";

    //正常队列
    public static final String NORMAL_QUEUE = "normal_queue";


    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        //设置消息的 TTL 时间
        AMQP.BasicProperties properties = new
                AMQP.BasicProperties().builder().expiration("10000").build();

        for (int i = 1; i < 11; i++) {
            String msg = "消息" + i;
            channel.basicPublish(NORMAL_EXCHANGE, "normal", properties, msg.getBytes(StandardCharsets.UTF_8));
        }
    }
}
5、监控图对比
  • 启动生产者,关闭消费者C1,未启动消费者C2
  • 启动生产者,关闭消费者C1,未启动消费者C2,时间经过10s后
  • 启动生产者,关闭消费者C1,启动消费者C2
6、设置过期时间
1、生产者设置

生产者设置具有灵活性,第一条消息可设置10s,第二条设置8s

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置消息的 TTL 时间
AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().expiration("10000").build();
2、消费者设置

消费者设置,所有消息的ttl都是一样的,没有灵活性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//正常队列绑定死信队列信息
Map<String, Object> params = new HashMap<>();
//设置过期时间
params.put("x-message-ttl", 10000);

//正常队列设置死信交换机 参数 key 是固定值
params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
//正常队列设置死信 routing-key 参数 key 是固定值
params.put("x-dead-letter-routing-key", "dead");
channel.queueDeclare(NORMAL_QUEUE, false, false, false, params);

3、队列达到最大长度

消息达到设置的最大长度后,多与的消息会进入死信队列

1、场景模拟

  1. 先启动消费者C1,创建好交换机和队列
  2. 关闭C1,然后启动生产者和消费者C2
  3. C1设置的队列最大长度为6,多与的消息会进入死信队列,被C2消费
  4. 再启动C1,C1消费6条
2、生产者
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Product {
    /**
     * 正常交换机
     */
    public static final String NORMAL_EXCHANGE = "normal_exchange";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        for (int i = 1; i < 11; i++) {
            String msg = "消息" + i;
            channel.basicPublish(NORMAL_EXCHANGE, "normal", properties, msg.getBytes(StandardCharsets.UTF_8));
        }
    }
}
3、消费者01
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Consumer01 {

    /**
     * 正常交换机
     */
    public static final String NORMAL_EXCHANGE = "normal_exchange";

    /**
     * 死信交换机
     */
    public static final String DEAD_EXCHANGE = "dead_exchange";

    //正常队列
    public static final String NORMAL_QUEUE = "normal_queue";
    //死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        //声明交换机
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);

        //正常队列绑定死信队列信息
        Map<String, Object> params = new HashMap<>();
        //设置过期时间
//        params.put("x-message-ttl", 10000);
        //设置队列长度的限制
        params.put("x-max-length", 6);
        //正常队列设置死信交换机 参数 key 是固定值
        params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
        //正常队列设置死信 routing-key 参数 key 是固定值
        params.put("x-dead-letter-routing-key", "dead");
        channel.queueDeclare(NORMAL_QUEUE, false, false, false, params);
        //声明队列 不共享 不持久化 不删除
        channel.queueDeclare(DEAD_QUEUE, false, false, false, null);

        //绑定交换机和队列
        channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, "normal");
        channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "dead");
        System.out.println("等待接收消息......");
        DeliverCallback deliverCallback =  (consumerTag, deliver) ->{
            //获取消息
            String message = new String(deliver.getBody(), "UTF-8");
            System.out.println("Consumer01接收到的消息为:" + message);
        };
        channel.basicConsume(NORMAL_QUEUE, true, deliverCallback, cancelCallback -> {});
    }
}
4、消费者02
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Consumer02 {

    /**
     * 死信交换机
     */
    public static final String DEAD_EXCHANGE = "dead_exchange";


    //死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        //声明交换机
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明队列 不共享 不持久化 不删除
        channel.queueDeclare(DEAD_QUEUE, false, false, false, null);

        //绑定交换机和队列
        channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "dead");
        System.out.println("等待接收消息......");
        DeliverCallback deliverCallback =  (consumerTag, deliver) ->{
            //获取消息
            String message = new String(deliver.getBody(), "UTF-8");
            System.out.println("Consumer02接收到的消息为:" + message);
        };
        channel.basicConsume(DEAD_QUEUE, true, deliverCallback, cancelCallback -> {});
    }
}
5、监控图对比
  • C1启动时,其他未启动
  • 启动生产者,关闭消费者,未启动C2
  • 启动C2
  • 启动C1
6、设置队列最大长度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//正常队列绑定死信队列信息
Map<String, Object> params = new HashMap<>();
//设置队列长度的限制
params.put("x-max-length", 6);
//正常队列设置死信交换机 参数 key 是固定值
params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
//正常队列设置死信 routing-key 参数 key 是固定值
params.put("x-dead-letter-routing-key", "dead");
channel.queueDeclare(NORMAL_QUEUE, false, false, false, params);

4、消息被拒绝

1、场景模拟

  1. 先启动消费者C1,创建好交换机和队列
  2. 然后启动生产者和消费者C2
  3. C1设置的队列拒绝接收消息“消息6”
  4. “消息6”被C2消费
2、生产者
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Product {
    /**
     * 正常交换机
     */
    public static final String NORMAL_EXCHANGE = "normal_exchange";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        for (int i = 1; i < 11; i++) {
            String msg = "消息" + i;
            channel.basicPublish(NORMAL_EXCHANGE, "normal", properties, msg.getBytes(StandardCharsets.UTF_8));
        }
    }
}
3、消费者01
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Consumer01 {

    /**
     * 正常交换机
     */
    public static final String NORMAL_EXCHANGE = "normal_exchange";

    /**
     * 死信交换机
     */
    public static final String DEAD_EXCHANGE = "dead_exchange";

    //正常队列
    public static final String NORMAL_QUEUE = "normal_queue";
    //死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        //声明交换机
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);

        //正常队列绑定死信队列信息
        Map<String, Object> params = new HashMap<>();
        //正常队列设置死信交换机 参数 key 是固定值
        params.put("x-dead-letter-exchange", DEAD_EXCHANGE);
        //正常队列设置死信 routing-key 参数 key 是固定值
        params.put("x-dead-letter-routing-key", "dead");
        channel.queueDeclare(NORMAL_QUEUE, false, false, false, params);
        //声明队列 不共享 不持久化 不删除
        channel.queueDeclare(DEAD_QUEUE, false, false, false, null);

        //绑定交换机和队列
        channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, "normal");
        channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "dead");
        System.out.println("等待接收消息......");
        DeliverCallback deliverCallback =  (consumerTag, deliver) ->{
            //获取消息
            String message = new String(deliver.getBody(), "UTF-8");
            if ("消息6".equals(message)){
                System.out.println("Consumer01 接收到消息" + message + "并拒绝签收该消息");
                //requeue 设置为 false 代表拒绝重新入队 该队列如果配置了死信交换机将发送到死信队列中
                channel.basicReject(deliver.getEnvelope().getDeliveryTag(), false);
            }else {
                System.out.println("Consumer01 接收到消息"+message);
                channel.basicAck(deliver.getEnvelope().getDeliveryTag(), false);
            }
        };
        //
        channel.basicConsume(NORMAL_QUEUE, false, deliverCallback, cancelCallback -> {});
    }
}
4、消费者02
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Consumer02 {

    /**
     * 死信交换机
     */
    public static final String DEAD_EXCHANGE = "dead_exchange";

    //死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMQConfig.getChannel();
        //声明交换机
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);
        //声明队列 不共享 不持久化 不删除
        channel.queueDeclare(DEAD_QUEUE, false, false, false, null);

        //绑定交换机和队列
        channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "dead");
        System.out.println("等待接收消息......");
        DeliverCallback deliverCallback =  (consumerTag, deliver) ->{
            //获取消息
            String message = new String(deliver.getBody(), "UTF-8");
            System.out.println("Consumer02接收到的消息为:" + message);
        };
        channel.basicConsume(DEAD_QUEUE, true, deliverCallback, cancelCallback -> {});
    }
}
5、监控图对比
  • 其他均启动,C2未启动时
6、设置消息被拒绝
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取消息
String message = new String(deliver.getBody(), "UTF-8");
if ("消息6".equals(message)){
    System.out.println("Consumer01 接收到消息" + message + "并拒绝签收该消息");
    //requeue 设置为 false 代表拒绝重新入队 该队列如果配置了死信交换机将发送到死信队列中
    channel.basicReject(deliver.getEnvelope().getDeliveryTag(), false);
}else {
    System.out.println("Consumer01 接收到消息"+message);
    channel.basicAck(deliver.getEnvelope().getDeliveryTag(), false);
}
//消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
channel.basicConsume(NORMAL_QUEUE, false, deliverCallback, cancelCallback -> {});

如果觉得内容不错的话,希望大家可以帮忙点赞转发一波,这是对我最大的鼓励,感谢🙏🏻

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小熊学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
敏捷团队的办公室设计
ThoughtWorks武汉办公室的装修花了三个月时间,整个办公室的装修设计体现了很多敏捷的特点,环境布置的目标就是为开展敏捷实践提供最大的方便。 ThoughtWorks旨在打造世界领先的办公环境,
ThoughtWorks
2018/04/13
1.2K0
敏捷团队的办公室设计
海外银行网点转型:银行线下网点转型成为品牌化共享空间
随着越来越多的银行分支机构的流量转向线上数字化,银行机构有大量机会重新定义实体渠道的基本作用。他们可以将闲置的空间转换成社区中心和联合办公环境,供寻求高科技会议场所的企业家和小型企业使用。
点滴科技资讯
2021/02/01
2.8K0
公司的电脑为什么卡——因为缺少工程师文化
一流的创业公司创始人往往来自一线公司工作多年的高管,招聘也是瞄准一线公司员工,所以薪资待遇和软硬件设施也一样优异甚至更佳。比如知名产品经理「纯银 v」的短视频创业(猫饼 App,两年被腾讯收购)提供这些:
社区小番茄
2021/12/28
6620
公司的电脑为什么卡——因为缺少工程师文化
公司的电脑为什么卡——因为缺少工程师文化
之前某浪的开发同学告诉我:公司的电脑很卡,申请内存条等了半年……结果学差不多就跳槽了。
大龄程序员老羊
2021/12/10
6990
优思学院|5S管理在办公室能够推行吗?
想象一下在一个杂乱无章的办公室中工作,你能高效率地完成工作吗?你的工作场所的安全和你的服务或产品的品质能得到保障吗?很明显,答案是否定的。
用户2865703
2023/04/03
3010
优思学院|5S管理在办公室能够推行吗?
元宇宙将如何改变工作的未来?
想象一下这样一个世界:你可以在海边与同事交谈,在空间站上漂浮着做会议记录,或者从你在伦敦的办公室瞬移到纽约,所有这些都不需要走出家门一步。今天安排了太多的会议,感到压力很大吗?那么,为什么不派遣你的 AI 数字双胞胎代替你来减轻你的负担呢?
用户9329036
2022/05/10
6300
元宇宙将如何改变工作的未来?
智能办公室如何提高员工满意度
物联网不仅改变了我们的生活方式,还改变了我们的工作方式。互联设备正在改善员工体验,并影响办公室的设计方式,以激发最佳的生产力和创造力。
用户4122690
2020/04/17
5910
智能办公室如何提高员工满意度
回不去了!科技公司的工作日常被永久改变,未来办公室狂想
居家封锁对工作的影响因人而异。对于那些整天在电脑上敲键盘的人来说,在家打字或在公司打字之间的差异可能并不大,尤其是在工资和福利保持不变的情况下。对于那些失去工作,负担不起房租的人来说,情况就不太一样了。
大数据文摘
2020/06/10
5310
Google Workspace发布「开会」神器:每个员工可以省11000美元!
Google最近公布了Workspace (以前也叫G Suit, Google Apps for Work) 的一系列更新,主要亮点是强化了搜索能力、Meet calling和Meet中的实时字幕翻译,还带来了罗技和Avocor共同推出的多合一视频会议设备。
新智元
2021/09/17
1.1K0
专访铃盛(RingCentral)何必苍:以不断创新的MVP赋能未来混合办公
编者按:疫情之下,随着海外远程办公常态化,混合办公作为一种新的办公趋势正在融入各行各业。作为一家全球领先的企业云通信提供商,铃盛(RingCentral)发布的MVP产品将即时消息、视频会议和云电话这三大功能集成在同一APP上,成为众多企业在混合办公模式下的新选择。 近日,LiveVideoStack采访了铃盛视频与媒体研发高级总监和杭州研发中心负责人何必苍,请他谈一谈铃盛对于混合办公模式的深入探索、铃盛所推出的多种创新产品和服务,以及近期在全球的战略合作。除此之外,他还向我们介绍了铃盛“工作需要幸福感”的
LiveVideoStack
2022/07/18
4750
专访铃盛(RingCentral)何必苍:以不断创新的MVP赋能未来混合办公
团队空间:敏捷团队的办公室设计
Martin Fowler在他的一篇博客(Team Room)中介绍了ThoughtWorks对敏捷软件开发团队所应采用的“团队空间”的观点:团队空间内部应当完全开放;应有自然光照入;为员工提供宽敞的空间;使用优质的座椅;给予团队自主配置空间的权利和能力;有大量的墙面空间用作“信息辐射器”(包括故事墙、架构图、燃尽图等形式),以及大量的白板用于随时发生的讨论;应该有玩具、小吃、饮料等活跃团队氛围的元素等等。
ThoughtWorks
2019/05/17
1.1K0
互联网公司的福利是鸡肋?
硅谷,互联网的策源地,工程师的天堂。在参访完Google和Facebook时,吸引我们目光的除了创新、开放、活泼的企业文化之外,还有令人震撼的员工福利:环境、饮食、关怀、娱乐,全方位无微不至的体贴在中国几乎找不到对标样本……一言概之,一群最聪明的人被幸福地包养着,让人艳羡不已,微软、思科以及国内的科技巨头相形见绌。不过,与这些公司的一些员工交流之后却我们得到了出人意料的答案。 1、坐在markzuckerberg隔壁 关于办公室的设置,微软与Facebook、Google则十分不同。 微软员工可以申请在家上
罗超频道
2018/04/25
1.1K0
10年内Facebook一半员工将远程办公,搬家还要降薪,小扎在二三线城市大举招人
小扎周四表示,他预计在未来5到10年间,Facebook50%的员工将永久远程办公。目前公司一共有4.8万人,大部分员工集中在旧金山湾区的门洛帕克园区。
新智元
2020/06/01
4750
Wi-Fi 6 并不会淘汰你的有线局域网
作者 | Dave Cartwright 译者 | 王强 审校 | 罗燕珊 IEEE 802.11ax-2021(通常称为 IEEE 802.11ax,或者大家更熟悉的“Wi-Fi 6”)技术标准于 2021 年 2 月 9 日获得批准,其最高速度为每个流 1.2Gbit/ 秒(这里的“流”可以看作是“频道”)。似乎每次新一代 Wi-Fi 技术面世时人们都会问同一个问题:新版标准最后能否让我们完全摆脱电缆的束缚,彻底转向无线连接? 但这里我要问一个稍微有点不一样的问题,那就是我们的世界将来是否会彻底消灭
深度学习与Python
2023/04/01
3030
Wi-Fi 6 并不会淘汰你的有线局域网
为什么谷歌、Facebook的AI研究员都坐在CEO身边?
大数据文摘作品 编译:小饭盆、于乐源、龙牧雪 如果你想了解一家科技公司的发展重点,可以先看看这家公司的座位表。 在谷歌的硅谷总部,首席执行官(CEO)Sundar Pichai与谷歌大脑(谷歌旗下致力于人工智能研究的实验室)在同一楼层工作。 七英里外,当Facebook创立自己的人工智能实验室时,人工智能研究人员的桌子曾被临时安放在一个会议室的鱼缸旁边,这个会议室是Facebook创始人兼CEO马克·扎克伯格的“御用”会议室。 Facebook的CTO Mike Schroepfer表示,“我可以跨过我的办
大数据文摘
2018/05/23
4110
为拯救“社恐”职场人,岛国人发明办公室隔断,能自己移动,还有这些用途…
大数据文摘转载自机器人大讲堂 请问屏幕前各位打工人,你们见过的最磕碜的办公室隔间长啥样? 2007年美国《连线》杂志曾邀请读者递交他们见过的最压抑、令人最难过的办公室隔间,在众多“参赛者”中,下面这货脱颖而出,夺得“桂冠”。 咱就是说隔了,又好像没隔。 打工人们,都2202年了,你还躲在这样的“小隔间”里办公吗?你还在觉得办公场所缺少隐私性吗? 最近,日本东北大学的研发团队搞了一个机器人名叫WaddleWalls,这是一种房间规模的交互式分区系统,由一组垂直可拉伸的机器人构成,机器人可以临时组成一个“格
大数据文摘
2023/04/10
3660
为拯救“社恐”职场人,岛国人发明办公室隔断,能自己移动,还有这些用途…
远程办公的终结
就在疫情三年间,远程办公还是相当火热的概念,甚至被视为未来工作的主流,许许多多正面声音肯定它的好处,国内外大大小小的公司也都开展了相关的实践。有很多人预测,即便疫情结束,远程办公也将是非常重要的工作形式。
小腾资讯君
2024/07/25
1900
情境计算是大数据、移动化和物联网的未来
一些可穿戴技术的引领者,比如谷歌眼镜,电影《Her》中的人工智能系统,我们习惯于把它称之为情境计算或普适计算或电子生活。它是数字化和人体相结合的产物,交织在一起,很难分清孰轻孰重。 在威斯康星州的麦迪逊举行的2014年 CEO-CIO研讨会上,来自芝加哥的移动战略和应用开发公司Solstice Mobile的CEO,J Schwan进行了演讲,他认为这一切正在发生,因为企业正在将移动计算,大数据分析以及物联网相结合起来。 移动操作系统,比如iOS和Android已经支持蓝牙低功耗协议,这意味着移动设备可以
大数据文摘
2018/05/22
9790
在家办公也酷玩:「虚拟硅谷」200家公司入驻,微软VROOM虚拟「阿凡达」远程真人互动
因为疫情,科技圣殿硅谷也偃旗息鼓,熠熠生辉的办公楼失去了往日的光彩,员工们都窝在家里,但技术宅们突发奇想,在网上搭建了一个「虚拟硅谷」。
新智元
2020/05/19
7020
在家办公也酷玩:「虚拟硅谷」200家公司入驻,微软VROOM虚拟「阿凡达」远程真人互动
窥探全球银行业最酷的 7 个金融科技创新实验室
银行经常因缺乏创新而受到嘲笑,但有些机构似乎非常认真地对待创新这件事,至少从他们创建的创新中心来看是这样。下面我们就来看一看希望跟上席卷整个行业的数字颠覆浪潮的银行打造的数字实验室、创意实验室和测试工厂。
点滴科技资讯
2021/11/02
2.1K0
推荐阅读
相关推荐
敏捷团队的办公室设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验