akka 异常处理_使用Akka处理1000万条消息

akka 异常处理

Akka演员承诺并发。 有什么更好的模拟方法,看看使用商品硬件和软件处理1000万条消息需要花费多少时间,而无需进行任何低级调整。我用Java编写了整个1000万条消息的处理过程,整个结果令我惊讶。

当我在具有i5 – 4核心,4 Gb RAM计算机和JVM堆的Intel i5 – 4内核的iMac计算机上运行程序时,该程序在23秒内处理了1000万台计算机。 我多次运行该程序,平均时间为25秒。 因此,我收到的吞吐量几乎在每秒40万条消息的范围内,这是惊人的。

下图说明了用于模拟负载生成方案的流程。

警告:每条消息在1秒钟后发送响应,这对于实际情况而言并非正确的模拟。 在这种情况下,消息处理将消耗堆和gc活动上一些未被考虑的资源。

该程序使用了Akka发布者的总体指导:在75秒内处理了1000万条消息(每条消息1秒)! 虽然没有任何限制。

该程序的代码库位于以下位置– https://github.com/write2munish/Akka-Essentials

ApplicationManagerSystem创建actor并泵送至WorkerActor的流量

private ActorSystem system;
  private final ActorRef router;
  private final static int no_of_msgs = 10 * 1000000;
 
  public ApplicationManagerSystem() {
 
   final int no_of_workers = 10;
 
   system = ActorSystem.create('LoadGeneratorApp');
 
   final ActorRef appManager = system.actorOf(
     new Props(new UntypedActorFactory() {
      public UntypedActor create() {
       return new JobControllerActor(no_of_msgs);
      }
     }), 'jobController');
 
   router = system.actorOf(new Props(new UntypedActorFactory() {
    public UntypedActor create() {
     return new WorkerActor(appManager);
    }
   }).withRouter(new RoundRobinRouter(no_of_workers)));
  }
 
  private void generateLoad() {
   for (int i = no_of_msgs; i >= 0; i--) {
    router.tell('Job Id ' + i + '# send');
   }
   System.out.println('All jobs sent successfully');
  }

一旦WorkerActor收到了消息,则计划将响应在1000毫秒后发送

public class WorkerActor extends UntypedActor {
 
  private ActorRef jobController;
 
  @Override
  public void onReceive(Object message) throws Exception {
    using scheduler to send the reply after 1000 milliseconds
   getContext()
     .system()
     .scheduler()
     .scheduleOnce(Duration.create(1000, TimeUnit.MILLISECONDS),
       jobController, 'Done');
  }
 
  public WorkerActor(ActorRef inJobController) {
   jobController = inJobController;
  }
 }

来自WorkerActor的响应消息被发送到JobControllerActor,后者收集所有响应。

public class JobControllerActor extends UntypedActor {
 
  int count = 0;
  long startedTime = System.currentTimeMillis();
  int no_of_msgs = 0;
 
  @Override
  public void onReceive(Object message) throws Exception {
 
   if (message instanceof String) {
    if (((String) message).compareTo('Done') == 0) {
     count++;
     if (count == no_of_msgs) {
      long now = System.currentTimeMillis();
      System.out.println('All messages processed in '
        + (now - startedTime)  1000 + ' seconds');
 
      System.out.println('Total Number of messages processed '
        + count);
      getContext().system().shutdown();
     }
    }
   }
 
  }
 }

参考: 教程:Hibernate,JPA和Spring MVC –来自Akka Essentials博客的JCG合作伙伴 Munish K Gupta的第2部分


翻译自: https://www.javacodegeeks.com/2012/05/processing-10-million-messages-with.html

akka 异常处理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值