在希望用户在短时间内进行一些更改的应用中,我想使用消息队列来收集这些事件,并且仅在新更改停止出现一段时间后才通知侦听器X
预期的工作流程为:
我已经研究了几种不同的消息队列的文档,但是似乎没有一个消息盒是现成的。
我确实找到了一些可能有助于推广自己的功能,例如Kafka有一个称为linger的生产者配置,告诉它等待X ms等待更多消息添加到批处理中,但这显然是为了提高性能。另外,此选项在生产者端,而对于我的用例,在消费者端更有意义。
这是一个用例消息队列可以支持吗?缺乏结果使我认为我可能尝试使用错误的消息队列。
答案 0 :(得分:0)
队列不适用于此类用例。我建议使用Cadence Workflow来轻松实现您的逻辑。
这是一个满足您要求的稻草人设计:
以下是用Java实现它的工作流程代码(也支持Go客户端):
public interface BufferedEditsWorkflow {
@WorkflowMethod
void execute(String userId, Duration notifyAfter, Edit firstEdit);
@SignalMethod
void addEdit(Edit edit);
}
public interface BufferedEditsActivities {
void notifyUser(String userId, List<Edit> edits);
void process(String userId, List<Edit> edits);
}
public class BufferedEditsWorkflowImpl implements BufferedEditsWorkflow {
private final List<Edit> edits = new ArrayList<>();
private final BufferedEditsActivities activities = Workflow.newActivityStub(BufferedEditsActivities.class);
@Override
public void execute(String userId, Duration notifyAfter, Edit firstEdit)
{
edits.add(firstEdit);
// Cadence doesn't have limit on sleep duration.
// It can sleep at this line for a year with no problem.
Workflow.sleep(notifyAfter);
activities.notifyUser(userId, edits);
activities.process(userId, edits);
}
@Override
public void addEdit(Edit edit) {
edits.add(edit);
}
}
启动第一次编辑工作流程的代码:
private void addFirstEdit(WorkflowClient cadenceClient, Edit edit) {
WorkflowOptions options = new WorkflowOptions.Builder().setWorkflowId(edit.getUserId()).build();
BufferedEditsWorkflow workflow = cadenceClient.newWorkflowStub(BufferedEditsWorkflow.class, options);
workflow.execute(edit.getUserId(), Duration.ofHours(1), edit);
}
添加更多修改的代码。
private void addEdit(WorkflowClient cadenceClient, Edit edit) {
WorkflowOptions options = new WorkflowOptions.Builder().setWorkflowId(edit.getUserId()).build();
BufferedEditsWorkflow workflow = cadenceClient.newWorkflowStub(BufferedEditsWorkflow.class, options);
workflow.addEdit(edit);
}
与使用队列进行任务处理相比,Cadence具有许多其他优点。
请参见介绍Cadence编程模型的the presentation。