我正在为我的团队的一个应用程序研究排队解决方案.理想情况下,我们希望能够将其配置为轻量级进程内代理(用于线程之间的低吞吐量消息传递)和外部代理.是否有可以执行此操作的MQ服务器?大多数似乎都需要将设置作为外部实体.ZeroMQ似乎最接近于进程内解决方案,但它似乎更像是"类固醇上的UDP套接字",我们需要可靠的交付.
Websphere Message Broker和队列管理器之间有什么区别.我想队列管理器将消息放入队列,将消息从队列中取出,将消息移到后退队列等等.那么代理的工作是什么?
它位于发布者和队列管理器之间,还是位于消费者和队列管理器之间?
我现在已经在一些设置中使用RabbitMQ,我无法摆脱必须有更容易设置的东西的感觉.尽管它很方便,但很难证明MQ只能处理每天处理几千条消息的解决方案,这仅仅是因为维护RabbitMQ是如此之多.
有没有人通过简单的安装和维护过程了解AMQP实施?
对于那些不了解它的人,RabbitMQ是用Erlang编写的AMQP实现.它应该是非常稳定的,但只有你对Erlang有足够的了解才能避免它的问题.无论是内存限制还是主机名的更改,总是需要深入了解它.
消息通道和消息队列本身有什么区别?
他们是不同的东西.队列实际上保存将以FIFO方式处理(推送到侦听器)的消息.
信道是传输消息的媒介.
这究竟是什么意思?在一本书"企业集成模式"中,它说:
使用消息通道连接应用程序,其中一个应用程序将信息写入通道,另一个应用程序从通道读取该信息.
这是否意味着此消息通道实际上将队列从消息的生产者和消费者中抽象出来?但它真的不对吗?当生产者必须将消息放入队列时,它实际上指定了它想要连接的队列管理器和队列名称.
还有通道中不同协议的概念和通道中的不同数据格式,您可能为每个协议使用单独的通道,也可能是每种数据格式(XML,JSON等)的单独通道.这将有助于不同的队列从不同的频道中获取.但为什么不直接为不同的数据格式调用不同的队列?渠道的作用究竟是什么?它只是一个连接?
我是MQM的全新人物.我刚刚被分配到这个涉及制作和消费消息的项目,我正试图围绕这个问题.
我是Akka的新手,在参考手册中找不到答案.
假设我们有远程actor分布在3台机器(A,B,C)的集群中,其中一个actor存在于每台机器上,而其他actor则有actorRef到另外两台机器,即:
Machine A:
A (real actor)
-> B (ref)
-> C (ref)
Machine B:
-> A (ref)
B (real actor)
-> C (ref)
Machine C:
-> A (ref)
-> B (ref)
C (real actor)
Run Code Online (Sandbox Code Playgroud)
Actor A执行以下代码:
bRef ! msg1
bRef ! msg2
Run Code Online (Sandbox Code Playgroud)
Actor B在消息处理程序中执行以下代码:
case msg1 =>
cRef ! msg3
aRef ! msg4
Run Code Online (Sandbox Code Playgroud)
Actor C在消息处理程序中执行以下代码:
case msg3 =>
aRef ! msg5
Run Code Online (Sandbox Code Playgroud)
我可以做出以下假设(如果有的话):
演员B在获得msg2之前得到msg1
演员A在获得msg4之前获得msg5
而后续问题可能导致了解上述内容:是否发送了消息!运营商是通过网络真正异步还是等到接收邮箱获得它?即行
bRef ! msg1
Run Code Online (Sandbox Code Playgroud)
阻止,直到演员B在其邮箱中获取消息,或者它是否产生处理传递并继续执行的线程
bRef ! msg2
Run Code Online (Sandbox Code Playgroud)
在它甚至知道演员B得到msg1之前?
我正在考虑系统将通知多个消费者有关一群物体发生的事件.每个订阅者应该能够订阅发生在零个或多个对象上的事件,多个订阅者应该能够接收有关发生在单个对象上的事件的信息.
我认为在这种情况下,某些消息排队系统是合适的,但我不知道如何处理我将拥有数百万个对象的事实 - 对每个对象使用单独的主题听起来不太好[或者是它正好?].
你能否建议我应该采取的方法,甚至可能是一些合理的开源消息排队系统?
更多细节:
在此先感谢您的反馈,并抱歉有些模糊的问题!
所以我花了这么多天试图解决这个似乎已被遗忘的事情,因为两个PECL扩展中没有一个(SAM和mqseries)已经更新了很长时间.我已经尝试过两者并且mqseries似乎让我在这一点上最远,因为SAM拒绝让我连接,即使MQ从命令行完美运行.我已经成功创建了与QueueManager的连接,并且在下一步(MQOPEN)中我惨遭失败:
$mqcno = array(
'Version' => MQSERIES_MQCNO_VERSION_2,
'Options' => MQSERIES_MQCNO_STANDARD_BINDING,
'MQCD' => array('ChannelName' => '[channel]',
'ConnectionName' => '[ipnumber]([port])',
'TransportType' => MQSERIES_MQXPT_TCP)
);
mqseries_connx('MQED', $mqcno, $conn, $comp_code,$reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
printf("Connx CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, $reason);
exit;
}
$mqods = array('ObjectName'=>'MYPUTQUEUE', 'ObjectType'=>MQOT_Q, 'ObjectQMgrName'=>'MYQUEUEMANAGER');
mqseries_open($conn, $mqods,
MQSERIES_MQOO_FAIL_IF_QUIESCING | MQSERIES_MQOO_OUTPUT,
$obj, $comp_code,$reason);
Run Code Online (Sandbox Code Playgroud)
这导致$ reason被填充为2044,转换为MQRC_OD_ERROR,或者英文:'在MQOPEN或MQPUT1调用中,对象描述符MQOD无效'.
所以问题是,我的MQOD出了什么问题?
更新#1:此时此问题尚未解决.我从头开始重建项目,以便在构建时解决任何问题.我仍然坚持MQOPEN返回2044.样本仍然从CLI运行完美,所以这绝对与PECL扩展的安装有关.如果有人在最近的64位PHP5环境中成功安装并运行PHP对MQ,请告诉我...
更新#2:MQPUT1完美地解决了我无法收到响应的问题.在这一点上,它只是MQOPEN不起作用.问题是; 什么导致MQOPEN在MQPUT1工作时返回2044,我理解包括MQOPEN?
1.)从.net客户端,我如何测试客户端是否连接到服务器(即可以发送和接收)是的,我可以在try块内发送消息并捕获随后的异常,但我希望更优雅的解决方案.
2)如何打开,关闭和重新打开连接?在我尝试解决上面的问题1时,我发现如果我打开连接然后调用connection.Close()我无法从连接工厂获得另一个连接(请参阅下面的代码片段).我收到错误消息XMSCC0008
我使用的是非常标准的vanilla MQ配置.以下是我的客户端连接方式:
ISession session = MQAccess.GetSession(MQAccess.Connection);
IDestination destination = session.CreateTopic(SubTopicName);
Consumer = MQAccess.GetConsumer(session, destination);
Consumer.MessageListener = new MessageListener(HandleMQSubEvent);
MQAccess.Connection.Start();
Run Code Online (Sandbox Code Playgroud)
其中MQAccess是一个小实用程序类.
编辑了添加MQAccess代码的问题:
public static class MQAccess
{
public static readonly MQConfigurationSectionHandler ConfigSettings;
public static readonly IConnectionFactory ConnectionFactory;
private static readonly IConnection connection;
public static IConnection Connection
{
get { return connection; }
}
static MQAccess()
{
ConfigSettings = (MQConfigurationSectionHandler)
ConfigurationManager.GetSection("mq-configuration");
XMSFactoryFactory factory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
ConnectionFactory = factory.CreateConnectionFactory();
ConnectionFactory.SetStringProperty(XMSC.WMQ_HOST_NAME, ConfigSettings.Hostname);
ConnectionFactory.SetIntProperty(XMSC.WMQ_PORT, ConfigSettings.Port);
ConnectionFactory.SetStringProperty(XMSC.WMQ_CHANNEL, ConfigSettings.Channel);
if (ConfigSettings.QueueManager == string.Empty)
{
ConnectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, …
Run Code Online (Sandbox Code Playgroud) 我有一个Java应用程序,需要在不同进程之间进行通信.进程可以在相同的JVM或不同的JVM中运行,但可以在同一台机器上运行.
我的应用程序需要将"消息"提交给另一个进程(相同或不同的JVM)并忘记它.类似于IBM"MQ"之类的消息传递队列,但是简单,只使用内存,没有IO到硬盘以获得性能提升.
我不确定Performance prescriptive的最佳方法是什么.
还有其他想法吗?
让我们暂时接受一下,实现RPC over消息队列(如RabbitMQ)并不是一个可怕的想法 - 有时在与遗留系统接口时可能是必要的.
在RPC over RabbitMQ的情况下,客户端向代理发送消息,代理将消息路由到工作者,工作者通过代理将结果返回给客户端.但是,如果一个worker实现了多个远程方法,那么不同的调用需要路由到不同的监听器.
这种情况下的一般做法是什么?所有RPC over MQ示例仅显示一个远程方法.将方法名称设置为路由规则/队列名称会很好很容易,但我不知道这是否是正确的方法.