搞事情?GitLab 竟公开拒收中国员工!

全球第二大开源代码托管平台GitLab宣布,将对中国和俄罗斯公民实施招聘限制,禁止向两国公民提供可接触客户数据的职位,并阻止有权限访问数据的员工移居至中国或俄罗斯。这一举措引发了开发者社区的广泛讨论。

双11提前预热,可提醒喝水的智能保温杯,下单输入优惠码“baowenbei”直降30元

640?wx_fmt=jpeg全球第二大开源代码托管平台GitLab出“幺蛾子”了!

640?wx_fmt=jpeg

GitLab是Google重金投资加持的开源独角兽,也是公认的GitHub主力竞争对手之一、全球第二大开源代码托管平台。2011年,乌克兰程序员Dmitriy Zaporozhets和Valery Sizov开发了它,最初由Ruby写成,后来一部分用Go语言重写。 截止去年,GitLab约有290名团队成员,以及2000多名开源贡献者, 被IBM、Sony、NASA、阿里、SpaceX等众多公司和组织所使用。
在 GitHub被微软收购之后的一段时间,GitLab曾经口碑高涨,为很多开发者所接纳。 今年7月份,GitHub突然对伊朗、克里米亚等地的账户进行断供的一事,也让 GitLab备受好评,因为它并没有像前者那般突然出击,而是提前告知了用户相关问题,而且还没有禁用任何repo。
但就在GitLab的最新声明里,却 明目张胆地以国籍和居住地限制招聘!

640?wx_fmt=png

在GitLab.com的官方issue里,出现这样一条: 我们决定对有权访问客户数据的团队成员启用“工作国家/地区封锁(job family country block)”, 而封锁名单上只有两个国家—— 中国和俄罗斯。
根据GitLab的解释,这就意味着:
  • GitLab不会给中国/俄罗斯公民提供Offer;

  • 那些有权限访问客户数据的员工,现在也不能移居到中国或俄罗斯。

GitLab方面解释,之所以采取这样的措施,一方面是因为企业客户对GitLab数据访问规则、国家地区政策的关注, 另一方面也是“当前地缘政治气候下行业的普遍做法”。 GitLab还表示,这个方案其实非常人道—— 因为这样一来,他们就不必给员工们划分三六九等了,所有限制地区以外的员工,都可以100%履行职责,不用担心没有权限访问数据的问题!
此消息一出,短短两三小时就在Hacker News上达到了近200讨论热度。很多开发者直言“一向以高透明度自称的GitLab这是在自己打脸吗!”、“开源也要搞这一套了吗?”、“对于开发者太不友好了!”...... 互联网发展至今,开源的力量不言而喻,而现在 以开源为生意模式的开源代码托管平台却做出这样的举动,着实太过滑稽。
那么对于GitLab公然拒收中国和俄罗斯人一事,你怎么看?
640?wx_fmt=png
640?wx_fmt=jpeg
 热 文 推 荐 
在RabbitMQ中,默认情况下,当消息被拒绝(reject)或否定确认(nack)时,这些消息会被放置在队列的尾部。然而,有时候我们希望将这些拒收的消息放置在队列的头部,以便优先处理。以下是实现这一功能的几种方法: 1. **使用死信队列(Dead Letter Exchange)**: - 配置一个死信交换机(Dead Letter Exchange)和死信队列(Dead Letter Queue)。 - 当消息被拒绝或否定确认时,将其发送到死信交换机,然后通过一个策略将这些消息重新路由到原始队列的头部。 2. **手动重新入队**: - 在消费者端,当消息被拒绝或否定确认时,手动将这些消息重新发布到队列的头部。 以下是一个使用死信队列的示例: ### 配置死信交换机和死信队列 ```java import com.rabbitmq.client.*; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeoutException; public class RabbitMQConfig { private static final String QUEUE_NAME = "my_queue"; private static final String DLX = "my_dlx"; private static final String DLQ = "my_dlq"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); // 创建死信交换机 channel.exchangeDeclare(DLX, "direct", true); // 创建死信队列 channel.queueDeclare(DLQ, true, false, false, null); channel.queueBind(DLQ, DLX, ""); // 创建主队列并设置死信交换机 Map<String, Object> argsMap = new HashMap<>(); argsMap.put("x-dead-letter-exchange", DLX); channel.queueDeclare(QUEUE_NAME, true, false, false, argsMap); channel.close(); connection.close(); } } ``` ### 消费者端处理拒收消息 ```java import com.rabbitmq.client.*; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeoutException; public class Consumer { private static final String QUEUE_NAME = "my_queue"; private static final String DLX = "my_dlx"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.basicConsume(QUEUE_NAME, false, new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { try { String message = new String(body, StandardCharsets.UTF_8); System.out.println("Received message: " + message); // 模拟处理逻辑 if (message.contains("reject")) { // 拒绝消息并重新入队 channel.basicNack(envelope.getDeliveryTag(), false, true); } else { channel.basicAck(envelope.getDeliveryTag(), false); } } catch (Exception e) { channel.basicNack(envelope.getDeliveryTag(), false, true); } } }); } } ``` ### 重新发布到队列头部 ```java import com.rabbitmq.client.*; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeoutException; public class RePublisher { private static final String QUEUE_NAME = "my_queue"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); // 重新发布消息到队列头部 Map<String, Object> headers = new HashMap<>(); headers.put("x-priority", 10); AMQP.BasicProperties props = new AMQP.BasicProperties.Builder() .headers(headers) .build(); String message = "This is a rejected message"; channel.basicPublish("", QUEUE_NAME, props, message.getBytes()); channel.close(); connection.close(); } } ``` 通过上述配置和代码实现,当消息被拒绝或否定确认时,会被重新发布到队列的头部。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值