标签: message-queue

更多线程,更好的性能?

当我写一个消息驱动的应用程序.就像标准的Windows应用程序一样,它广泛使用消息传递进行内部操作,这对于线程化的最佳方法是什么?

在我看来,基本上有三种方法(如果你有任何其他设置,请分享):

  1. 有一个线程处理所有消息.
  2. 为不同的消息类型(通用,UI,网络等)提供单独的线程
  3. 拥有多个共享和处理单个消息队列的线程.

那么,三者之间是否存在显着的性能差异?以下是一些一般性的想法:显然,最后两个选项受益于多个处理器的情况.另外,如果任何线程正在等待外部事件,则其他线程仍然可以处理不相关的消息.但忽略这一点,似乎多线程只增加开销(线程切换,更不用说更复杂的同步情况).

另一个问题:您是否建议在标准的Windows消息传递系统上实现这样的系统,或者实现单独的队列机制,为什么?

c++ winapi multithreading message-queue

5
推荐指数
2
解决办法
1113
查看次数

PHP + MySQL队列

我需要一个充当队列的简单表.我的MySQL服务器限制是我不能使用InnoDB表,只能使用MyISAM.

客户/工作人员将同时工作,他们每次都需要接收不同的工作.

我的想法是做以下(伪代码):

$job <- SELECT * FROM queue ORDER BY last_pop ASC LIMIT 1;
UPDATE queue SET last_pop WHERE id = $job->id
return $job
Run Code Online (Sandbox Code Playgroud)

我曾尝试过表锁和"GET_LOCK",但没有任何事情发生,工人有时会收到同样的工作.

php mysql queue message-queue

5
推荐指数
1
解决办法
6031
查看次数

异步消息队列和处理,如django中的Amazon Simple Queue服务

应用程序上有许多活动需要以下内容:

  • 发送电子邮件,发布到Twitter
  • 将图像缩小为多种尺寸
  • 打电话给cron找到连接的关系

执行这些任务的一种好方法是写入执行操作的异步队列.

什么django应用程序可以用来实现这样的功能,就像Amazon Simple Queue服务在本地提供的那样?

我遇到过芹菜.正确的事?还有其他什么东西,像这样吗?

django asynchronous message-queue rabbitmq celery

5
推荐指数
1
解决办法
1095
查看次数

如何安排发送电子邮件

使用PHP,我有一个查询,通过我的数据库在一天中的某些时间查找具有提醒触发器的待处理任务.我有一个每10分钟运行一次的cronjob,并检查数据库中是否有"remind_me"字段设置为在接下来的10分钟内关闭的任何行.如果确实找到了什么,那么使用任务信息排队电子邮件的最佳方法是什么?

我想我需要某种消息队列系统,但电子邮件部分如何工作?我是否需要另一个每分钟运行一次的cronjob来检查队列系统?

php message-queue

5
推荐指数
1
解决办法
1万
查看次数

使用MongoDB作为Celery的消息队列

我正在尝试使用MongoDB作为Celery的消息队列(在Django应用程序中).Celery(2.2.0rc2)的当前开发版本应该允许你这样做,但我似乎无法让任何工作人员去接受我正在创建的任务.

版本:芹菜v2.2.0rc3
mongodb 1.6.5
pymongo 1.9
django-celery 2.2.0rc2

在我的设置中,我有:

CELERY_RESULT_BACKEND = "mongodb"
CELERY_MONGODB_BACKEND_SETTINGS = {
    # Shouldn't need these - defaults are correct.
    "host": "localhost",
    "port": 27017,
    "database": "celery",
    "taskmeta_collection": "messages",
}

BROKER_BACKEND = 'mongodb'
BROKER_HOST = "localhost"
BROKER_PORT = 27017
BROKER_USER = ""
BROKER_PASSWORD = ""
BROKER_VHOST = ""

import djcelery
djcelery.setup_loader()
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个测试tasks.py文件,如下所示:

from celery.decorators import task

@task()
def add(x, y):
    return x + y
Run Code Online (Sandbox Code Playgroud)

如果我在后台启动芹菜,它似乎正常启动.然后我打开一个python shell并运行以下命令:

>>> from myapp.tasks import add
>>> result = add.delay(5,5)
>>> result
<AsyncResult: …
Run Code Online (Sandbox Code Playgroud)

django message-queue rabbitmq mongodb celery

5
推荐指数
1
解决办法
3043
查看次数

如何在确保每个实体FIFO的同时并行处理消息?

假设您的系统中有一个实体,例如“ Person”,并且您想处理修改各种Person实体的事件。重要的是:

  • 同一个人的事件以FIFO顺序处理
  • 多个Person事件流由不同的线程/进程并行处理

我们有一个使用共享数据库和锁来解决此问题的实现。线程竞争为一个人获取锁,然后在获取锁后按顺序处理事件。我们希望移到消息队列中以避免轮询和锁定,我们认为这将减少数据库的负载并简化使用者代码的实现。

我已经对ActiveMQ,RabbitMQ和HornetQ进行了一些研究,但是我看不到实现这一目标的明显方法。

ActiveMQ支持使用者订阅通配符,但是我没有看到一种将每个队列的并发限制为1的方法。如果可以,那么解决方案将很简单:

  • 不知何故告诉代理,以/ queue / person开头的所有队列允许并发1。
  • 发布者使用队列名称中的“人员ID”将事件写入队列。例如:/queue/person.20
  • 消费者使用通配符订阅队列:/ queue / person。
  • 每个消费者将收到针对不同人员队列的消息。如果所有人队列都在使用中,则某些消费者可能会闲置,没关系
  • 处理完一条消息后,使用者将发送一个ACK,告知代理已完成该消息,并允许将用于该Person队列的另一条消息发送给另一个使用者(可能是同一条)

ActiveMQ即将结束:您可以进行通配符订阅并启用“独占使用者”,但是这种结合导致单个使用者接收发送到所有匹配队列的所有消息,从而将所有人员的并发性降低为1。我觉得我缺少明显的东西。

问题:

  • 是否可以通过任何主要的消息队列实现来实现上述方法?我们对选择持开放态度。唯一的要求是它必须在Linux上运行。
  • 有没有其他方法可以解决我不考虑的一般问题?

谢谢!

concurrency activemq-classic message-queue rabbitmq hornetq

5
推荐指数
1
解决办法
3812
查看次数

POSIX消息队列 - 打开时出错:参数无效

我在linux上创建消息队列时遇到了麻烦.我得到的错误是"无效的参数".我要做的另一件事是代码是Qt项目的一部分.

常见的错误是名称不以(/)开头且arg的数量不正确,但我检查了那些!

这是我正在尝试运行的代码:

#define MQ_TEST_PATH            "/test_queue"
#define MQ_MAX_MSG_SIZE         256
#define MQ_MAX_MSG_COUNT        20

struct mq_attr mqAttr;
mqAttr.mq_maxmsg = MQ_MAX_MSG_COUNT;
mqAttr.mq_msgsize = MQ_MAX_MSG_SIZE;

mq_unlink(MQ_TEST_PATH);

mode_t mode =  S_IRUSR | S_IWUSR;
int oflags = O_WRONLY | O_CREAT | O_EXCL;

mqd_t mqd;
mqd = mq_open(MQ_TEST_PATH, oflags, mode, &mqAttr);

if(mqd < 0){
    perror("Error on open");
    qDebug()<<mqd;
    return 0;
}

mq_close(mqd);
mq_unlink(MQ_TEST_PATH);
Run Code Online (Sandbox Code Playgroud)

输出:

Error on open: Invalid argument
-1 
Run Code Online (Sandbox Code Playgroud)

c linux qt message-queue

5
推荐指数
1
解决办法
8006
查看次数

在RabbitMQ中获取历史数据

我必须报告发布到RabbitMQ的消息数量以及RabbitMQ在使用1天内消耗的消息数量.通过使用RabbitMQ提供的REST API,我能够在某个时间间隔获取统计信息的快照. 如何使用相同的REST API 24小时获取数据.

message-queue rabbitmq spring-rabbit

5
推荐指数
0
解决办法
538
查看次数

HandlerThread中的NullPointerException

这个错误困扰了我好几个小时.我收到了NullPointerException.问题是这个错误不一致.它发生在我启动应用程序时,但只是偶尔发生.所以我不确定是什么导致它.

我为错误日志的冗长问题道歉,但我找不到另一种询问方式.

错误日志如下:

FATAL EXCEPTION: main
Process: com.myproject.android, PID: 22175
java.lang.NullPointerException
    at com.myproject.android.ImageDownloaderThread.queueImage(ImageDownloaderThread.java:74)
    at com.myproject.android.NewsItemPagerActivity$NewsItemFragmentStatePagerAdapter.getItem(NewsItemPagerActivity.java:325)
    at android.support.v13.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:109)
    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:982)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
    at android.view.Choreographer.doFrame(Choreographer.java:544)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5001)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515) …
Run Code Online (Sandbox Code Playgroud)

android message-queue background-thread android-handlerthread android-looper

5
推荐指数
1
解决办法
2582
查看次数

Android:IllegalStateException:无法在MessageQueue.nativePollOnce(MessageQueue.java)上创建图层

多年来,我一直对此错误感到烦恼。

Fatal Exception: java.lang.IllegalStateException: Unable to create layer for MatchCard_
   at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
   at android.os.MessageQueue.next(MessageQueue.java:143)
   at android.os.Looper.loop(Looper.java:130)
   at android.app.ActivityThread.main(ActivityThread.java:5942)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Run Code Online (Sandbox Code Playgroud)

并非总是如此,而是经常出现。视图是这样构建的

<?xml version="1.0" encoding="utf-8"?>
<com.soudfa.views.RoundedView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="@integer/match_card_height"
android:layout_gravity="@integer/match_card_card_gravity"
android:transitionGroup="true"
android:layoutDirection="locale"
app:cardPreventCornerOverlap="@bool/match_card_prevent_corner_overlap"
app:corner_radius="@dimen/corner_radius"
app:cardElevation="0dp">

<com.soudfa.fragments.match.views.CustomRecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="@integer/match_card_height"
    android:layout_gravity="@integer/match_card_card_gravity"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:clipToPadding="false"
    android:scrollbars="@integer/match_card_scroll_bar"
    android:background="@color/brightest"
    android:overScrollMode="never"/>

<FrameLayout
    android:id="@+id/leftActionImageContainer"
    android:layout_width="@dimen/match_card_decision_icon_size_start"
    android:layout_height="@dimen/match_card_decision_icon_size_start"
    android:layout_centerVertical="true"
    android:layout_alignParentStart="true"
    android:alpha="0"
    android:background="@drawable/shape_match_decision_icon_like"
    android:elevation="@dimen/general_elevation"
    android:padding="@dimen/match_card_decision_icon_padding"
    android:scaleType="fitCenter"
    android:scaleX="0"
    android:scaleY="0">

    <ImageView
        android:id="@+id/leftActionImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:tint="@color/custom_match_card_action_positive"/>

</FrameLayout>

<FrameLayout
    android:id="@+id/rightActionImageContainer"
    android:layout_width="@dimen/match_card_decision_icon_size_start"
    android:layout_height="@dimen/match_card_decision_icon_size_start"
    android:layout_centerVertical="true"
    android:layout_alignParentEnd="true"
    android:alpha="0" …
Run Code Online (Sandbox Code Playgroud)

android message-queue kotlin

5
推荐指数
0
解决办法
658
查看次数