小编Jak*_*ene的帖子

Akka Actors:在不丢失数据的情况下处理数据库故障

场景
应用程序的数据库已关闭.这导致任何负责将重要数据提交给DB的任何actor都无法获得连接

首选行为
重要数据在将来某个时间重新启动时写入数据库.

当前实现
actor捕获DBException,将数据包装在DBWriteFailed案例类中,并将消息发送给其主管.然后,主管使用system.scheduler.scheduleOnce(...)在将来某个时间(例如1分钟)安排另一次写入,这样我们就不会在等待DB重新启动时过多旋转.

这种实现肯定有效,但我觉得可能有更好的方法.

  • 当提交的actor在成功提交后必须响应原始发送者时,协议会变得有点麻烦.
  • 对提交actor的常规消息流不会受到任何限制,并且actor会愉快地处理新消息,可能无法连接到每个消息的DB.
  • 如果消息在此重试循环中被捕获的时间过长,则提交的actor的邮箱将开始出现气球.提交此数据非常重要,但如果应用程序因内存使用过多而导致停止或崩溃,则无关紧要.

我是akka新手,在涉及主管策略方面,我基本缺乏经验,但我觉得我可以利用其中一个来处理一些重试逻辑.

在akka中有一个共同的方法来解决这样的问题吗?我是在正确的轨道上还是我应该向不同的方向前进?

任何帮助表示赞赏.

database scala actor akka

11
推荐指数
1
解决办法
2119
查看次数

Scala:接收服务器发送事件

建立:

我正在处理的项目有一个带有HTTP接口的pub/sub服务器.订阅通过接受服务器发送事件来工作.

curl -X GET server:port/topics/news
Run Code Online (Sandbox Code Playgroud)

每当消息发布到给定主题URL时将被推送

curl -X PUT server:port/topics/news -d "Politician Lies!"
Run Code Online (Sandbox Code Playgroud)

问题:

我有一个scala项目需要订阅这个pub/sub服务器.表演!框架能够通过使用带有Enumeratee + Iteratee的PlayWS来处理这个问题.不幸的是,PlayWS库需要Play!应用程序在范围内,我不使用Play.是否有一个库(具有最小的依赖性)我可以使用它允许我接受服务器发送事件?我需要至少一个工作示例才能开始使用.

我喜欢scala库,但如果必须,我愿意接受Java解决方案.

scala http server-sent-events spray playframework-2.0

8
推荐指数
1
解决办法
1304
查看次数

Akka测试主管错误处理

我有以下内容:

class Supervisor(dataProvider: DatabaseClientProvider) extends Actor {
  val writer = context.actorOf(Props(classOf[Child], dataProvider.get))
  def receive: Receive = {
    case Msg => writer forward msg 
  }
  override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 100) {
    case e: ConnectionException => Resume
  }
}

class Child(db: DatabaseClient) extends Actor {
  def receive: Receive = {
    case msg:Msg => db.write(text)
  }
}
Run Code Online (Sandbox Code Playgroud)

我想在单元测试上面的代码基本上我试图确保当异常发生时,我们仍然恢复处理,如下所示.问题是主管没有抓住任何例外.测试下面代码的最佳方法是什么?

"resume handling messages when exception occurs" in {

  // Given
  val msg1 = Msg("Some msg1")
  val msg2 = Msg("Some msg2")

  //Throw an exception …
Run Code Online (Sandbox Code Playgroud)

unit-testing scala actor akka

7
推荐指数
1
解决办法
1726
查看次数

观察?设计模式

我有

public class mammal implements Imammle
{

    public String getName() {
        return "Mammal";
    }

    public String speak() {
        return getName() +  "Maaaauuu";
    }

}
Run Code Online (Sandbox Code Playgroud)

我需要知道我的动物什么时候发出声音,以便我能像吃饭一样实时采取相应的行动.
我应该使用什么样的设计模式?谢谢.

design-patterns

2
推荐指数
1
解决办法
2011
查看次数

卡桑德拉时间序列:允许过滤,桶或其他

我知道这里有很多时间序列问题,但我似乎并不适合给定的解决方案.我也是Cassandra的新手,所以我可能会用错误的心态接近这个.忍受我.

我收到以下表格中的搜索数据:

datetime_searched, term_used, product_found
Run Code Online (Sandbox Code Playgroud)

以及我想做的查询:

给定开始日期和结束日期,返回属于该时间窗口的所有术语 - 产品对.最初,窗口将持续一个月.这可能(读:会)改变.

例如,给出以下数据:

2013-11-20 00:00:00, "christmas", "decorated tree"
2014-12-01 20:00:00, "christmas", "wrapping paper"
2014-12-23 15:00:00, "christmas", "decorated tree" (duplicate term-product)
Run Code Online (Sandbox Code Playgroud)

以及对2014-12-01到2015-01-01时间范围的查询,我希望能够检索:

"christmas", "wrapping paper"
"christmas", "decorated tree"
Run Code Online (Sandbox Code Playgroud)

我的初始方法看起来像时间序列数据的大多数示例:

CREATE TABLE search_terms (
  datetime_searched timestamp,
  term_used text,
  product_found text,
  PRIMARY KEY (term_used, date_searched)
);

SELECT term_used, product_found
FROM search_terms 
WHERE datetime_searched > [start] 
AND datetime_searched < [end];
Run Code Online (Sandbox Code Playgroud)

但这需要我有二级索引和/或允许过滤,这似乎是我应该避免的,如果我只捕获一小部分被过滤的数据.

我的第二个想法是创建时间桶,但这个解决方案似乎只有在我将查询限制在桶时才有效.它似乎也创造了热点 - 在我最初的情况下,是一个长达一个月的热点.例如,对于每日桶:

CREATE TABLE search_terms_by_day (
  datetime_searched timestamp,
  day_searched timestamp,
  term_used text,
  product_found …
Run Code Online (Sandbox Code Playgroud)

database data-modeling time-series cql cassandra

2
推荐指数
1
解决办法
1063
查看次数