【问题标题】:How can a task source gain access to a Hazelcast ExecutorService without accepting tasks?任务源如何在不接受任务的情况下访问 Hazelcast ExecutorService?
【发布时间】:2017-06-09 22:58:32
【问题描述】:

假设我有一个使用 Hazelcast 进行成员之间通信的集群,并且我想提供一个任务执行服务。一些集群成员是任务源(针对服务请求进行了优化),而其他成员是任务接收器(针对长时间运行的计算进行了优化)。如何配置任务源以访问服务而不允许它们接受和运行任务?

类似的问题(例如Can a Hazelcast ExecutorService be created to execute on a subset of the cluster?)已经得到了使用executeOnMembers等建议的回答,但是这种方法需要我在ExecutorService外部实现公平的负载平衡和任务分配,这违背了使用该服务的目的。

我理想的解决方案是使用pool-size0 配置任务源成员,但这是被验证器拒绝的无效配置。

【问题讨论】:

  • github.com/hazelcast/hazelcast/issues/532 似乎正是我想要的,但这是一个悬而未决的问题
  • @Stephan 我认为它们没有直接关系。这张票是/更多的是要影响数据分布。您可以使用 lite 成员设置停用成员上的存储,并使用 MemberSelector 选择要执行的 lite 成员(请参阅下面的完整答案:-))

标签: java distributed-computing executorservice hazelcast


【解决方案1】:

您应该将您的计算成员设置为 lite 成员 (http://docs.hazelcast.org/docs/3.7/manual/html-single/index.html#enabling-lite-members) 并使用 executesubmit 的 MemberSelector 版本,它可以自动随机化所有选定的成员(一种相当简单的负载平衡方式,但使用相同的 Hazelcast默认情况下用于普通方法)。

两个相应的方法是http://docs.hazelcast.org/docs/3.7/javadoc/com/hazelcast/core/IExecutorService.html#execute-java.lang.Runnable-com.hazelcast.core.MemberSelector-http://docs.hazelcast.org/docs/3.7/javadoc/com/hazelcast/core/IExecutorService.html#submit-java.util.concurrent.Callable-com.hazelcast.core.MemberSelector-

MemberSelector 本身是一个过滤器界面,您可以在其中根据您的要求过滤成员。例如,当您将 lite 成员配置为 return member.isLiteMember() (http://docs.hazelcast.org/docs/3.7/javadoc/com/hazelcast/core/Member.html#isLiteMember--) 时。可以使用其他成员属性 (http://docs.hazelcast.org/docs/3.7/manual/html-single/index.html#defining-member-attributes) 对选择过程进行进一步调整。

如果你需要更复杂的负载平衡,你必须自己做,但是你已经说过你不想实现它:)

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2013-04-10
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多